FastapI에서 첫 번째 REST API 생성

15083 단어 fastapipythonrestapi

이 문서에서 Fast API: Rest API를 만드는 데 사용되는 Python 기반 프레임워크를 소개합니다.이 프레임워크의 몇 가지 기본 기능을 간략하게 소개한 다음에 연락처 관리 시스템에 간단한 API를 만들 것입니다.이 프레임워크를 사용하려면 파이톤을 이해하는 것이 매우 필요하다.
FastapI 프레임워크를 논의하기 전에 REST 자체에 대해 이야기합시다.
위키백과:

Representational state transfer (REST) is a software architectural style that defines a set of constraints to be used for creating Web services. Web services that conform to the REST architectural style, called RESTful Web services, provide interoperability between computer systems on the Internet. RESTful Web services allow the requesting systems to access and manipulate textual representations of Web resources by using a uniform and predefined set of stateless operations. Other kinds of Web services, such as SOAP Web services, expose their own arbitrary sets of operations.[1]


FastapI 프레임워크란?


공식 website:

FastAPI is a modern, fast (high-performance), web framework for building APIs with Python 3.6+ based on standard Python type hints.


네, fastvery fast입니다. 이것은 파이톤 3.6+의 비동기 기능이 기존의 지원을 제공했기 때문입니다. 이것이 바로 최신 버전의 파이톤을 사용하는 것을 권장하는 이유입니다.

FastapI는 Flask와 DRF 등 기존 프레임에 만족하지 않는 사람들이 만들었다.자세한 내용은 here을 참조하십시오.해당 웹 사이트에 언급된 주요 기능은 다음과 같습니다.

  • 빠른 속도: NodeJS와 Go와 막상막하(스타렛과 Pydantic 덕분).One of the fastest Python frameworks available .

  • 빠른 인코딩: 200~300% 더 빠른 속도로 기능을 개발할 수 있습니다.*

  • 오류 감소: 인위적인 오류(개발자)의 약 40% 감소*

  • 직관적: 훌륭한 편집기 지원입니다.여기저기 다.디버그 시간이 더 짧습니다.

  • 단순성: 사용과 학습이 용이하도록 설계되었습니다.문서를 읽는 시간을 줄이다.

  • 요컨대 코드의 중복을 최대한 줄여라.매개 변수마다 성명된 여러 기능입니다.더 적은 벌레.

  • 건장: 생산 코드를 준비하세요.자동 상호 작용 문서.

  • 표준 기반: API 개방형 표준 기반(open API)
  • Fast API의 창립자는 자이언트의 어깨 위에 서서 기존의 도구와 프레임, 예를 들어 StarlettePydantic을 사용한다고 믿는다.

    설치 및 설정


    API의 개발 환경을 설정하려면 Pipenv을 사용하십시오.Pipenv는 컴퓨터에 무엇이 설치되어 있든지 간에 격리 개발 환경을 더욱 쉽게 합니다.컴퓨터에 설치되어 있지 않은 Python 버전을 선택할 수 있습니다.Pipfile을 사용하여 프로젝트와 관련된 모든 종속성을 관리합니다.Pipenv는 여기서 자세히 설명하지 않으므로 프로젝트에 필요한 명령만 사용합니다.
    pip install Pipenv를 실행하여 PyPy를 통해 Pipenv를 설치할 수 있습니다.
    pipenv 설치 --python 3.9
    설치 후, 명령pipenv 셸을 실행해서 가상 환경을 활성화할 수 있습니다

    pipenv 설치-three를 실행할 수 있습니다.three는 Python 3을 표시합니다.x.
    설치 후, 명령pipenv 셸을 실행해서 가상 환경을 활성화할 수 있습니다
    먼저 다음 명령을 실행하여 FastapI를 설치합니다. pipenv install FastapI

    이것은 pipenv입니다. pip가 아닙니다.케이스에 들어갈 때 pipenv를 사용합니다.그것의 밑바닥은 pip를 사용하지만, 모든 항목은 pip 파일에 저장됩니다.PIP 파일은 다음과 같습니다.
    네, 우리는 이미 개발 환경을 설정했습니다.우리의 첫 번째 API 단점을 작성할 때가 되었다.나는main이라는 파일을 만들 것이다.피야.이것은 우리 응용 프로그램의 입구점이 될 것이다.
    from fastapi import FastAPI
    
    app = FastAPI()
    
    [@app](http://twitter.com/app).get("/")
    def home():
        return {"Hello": "FastAPI"}
    
    만약 네가 소병 위에서 일한 적이 있다면, 너는 그것이 매우 비슷하다는 것을 발견할 수 있을 것이다.필요한 라이브러리를 가져온 후, 응용 프로그램 실례를 만들고, 장식기를 사용하여 첫 번째 경로를 만들었습니다.
    지금 너는 그것을 어떻게 운행하는지 알고 싶다.FastapI에는 ASGI 서버인 uvicorn이 함께 제공됩니다.uvicorn main 명령을 실행하기만 하면 됩니다. app-reload
    파일 이름 (이 예는main.py) 과 클래스 대상 (이 예는app) 을 제공합니다. 서버를 시작합니다.매번 변경된 후에 자신을 다시 불러올 수 있도록 --reload 로고를 사용하고 있습니다.

    http://localhost:8000/에 액세스하면 JSON 형식의 메시지 {"Hello": "FastapI"} 를 볼 수 있습니다.
    멋있지 않아요?
    또한 FastapI는 API 문서 엔진을 제공합니다.http://localhost:8000/docs에 액세스하면 Swagger UI 인터페이스가 사용됩니다.

    혹은 신기한 것이 필요하시면 http://localhost:8080/redoc을 방문하세요

    FastapI는 http://127.0.0.1:8000/openapi.json과 같은 API 엔드포인트의 OpenAPI 버전도 제공합니다.

    경로 및 매개변수


    우리 계속 전진합시다.다른 API 끝점을 추가했습니다.예를 들어, 이것은 id를 통해 연락처를 얻는 것에 관한 것입니다.
    [@app](http://twitter.com/app).get("/contact/{contact_id}")
    def contact_details(contact_id: int):
        return {'contact_id': contact_id}
    
    contact details, int 인자만 받아들이고 dict 형식으로 되돌려주는 방법이 있습니다.이제 cURL을 통해 액세스할 때 다음과 같이 표시됩니다.

    지금 만약 내가 정수가 아닌 문자열을 전달한다면?아래 그림을 보실 수 있을 거예요.

    봤어요?잘못된 데이터 형식을 보냈다는 오류 메시지를 되돌려줍니다.너는 이런 자질구레한 일들을 위해 검증기를 작성할 필요가 없다.이것이 바로 FaastapI에서 일하는 미묘한 점이다.

    검색 문자열


    만약 검색 문자열의 형식으로 추가 데이터를 전달한다면?예를 들어, API 끝점이 많은 레코드를 반환하므로 페이지를 나누어야 합니다.문제 없어, 너도 이 정보를 얻을 수 있어.
    우선 다음과 같은 옵션 유형을 가져옵니다.
    가져오기에서 옵션 가져오기
    [@app](http://twitter.com/app).get("/contact/{contact_id}")
    def contact_details(contact_id: int, page: Optional[int] = 1):
        if page:
            return {'contact_id': contact_id, 'page': page}
        return {'contact_id': contact_id}
    
    여기에서, 나는 다른 매개 변수 페이지를 전달했고, 여기에 Optional [int] 유형을 설정했다.선택할 수 있습니다. 말 그대로 선택할 수 있는 매개 변수입니다.int 형식을 설정하면 정수치만 받아들일 수 있도록 합니다. 그렇지 않으면 위와 같은 오류가 발생합니다.
    URL http://127.0.0.1:8000/contact/1?page=5에 액세스하면 다음과 같이 표시됩니다.

    멋있지 않아요?
    지금까지 우리는 단지 수동으로 dict로 돌아왔을 뿐이다. 그것은 결코 멋있지 않다.값을 입력하고 YUUGE JSON 구조를 반환하는 것이 일반적입니다.FastapI는 Pydantic models을 사용하여 우아한 처리 방법을 제공합니다.
    Pydantic 모델은 실제로 데이터 검증에 도움이 된다. 이것은 무엇을 의미하는가?이것은 전달하고 있는 데이터가 유효한지 확인하는 것을 의미한다. 그렇지 않으면 오류가 되돌아올 것이다.Python의 형식 암시를 사용하고 있습니다. 이 데이터 모델은 정화된 데이터를 전달하고 있습니다.코드를 한 토막 쓰자.이를 위해, 나는 다시 연락처 API를 확장할 것이다.
    from typing import Optional
    
    from fastapi import FastAPI
    from pydantic import BaseModel
    app = FastAPI()
    
    class Contact(BaseModel):
        contact_id:int
        first_name:str
        last_name:str
        user_name:str
        password:str
    
    [@app](http://twitter.com/app).post('/contact')
    async def create_contact(contact: Contact):
        return contact
    
    pydantic에서 BaseModel 클래스를 가져왔습니다.그 후에 모델 클래스를 만들고 BaseModel 클래스를 확장했으며 세 개의 필드를 설정했습니다.저도 그것의 유형을 설정하고 있으니 주의하십시오.완료되면 POST API 끝점을 만들고 Contact 매개변수를 전달합니다.간단한 python 함수를 협동 프로그램으로 바꾸는 async를 사용합니다.FastapI는 포장을 풀면 바로 사용할 수 있습니다.
    http://localhost:8080/docs으로 이동하면 다음과 같습니다.

    CURL 명령을 실행하면 다음과 같이 표시됩니다.

    예상대로 Contact 객체는 JSON 형식으로만 반환됩니다.
    보시다시피 비밀번호를 포함한 전체 모델은 JSON 형식으로 저장됩니다.비밀번호가 순수한 텍스트 형식이 아니어도 의미가 없습니다.그럼 어떡하지?정답은 Response Model입니다.

    반응 모형은 무엇입니까


    말 그대로 응답 모델은 요청이 응답을 보낼 때 사용하는 모델이다.기본적으로, 모형을 사용할 때, 모든 필드만 되돌려줍니다.응답 모델을 사용하면 사용자에게 되돌려야 할 데이터 형식을 제어할 수 있습니다.코드를 좀 수정합시다.
    class Contact(BaseModel):
        contact_id:int
        first_name:str
        last_name:str
        user_name:str
        password:str
    
    class ContactOut(BaseModel):
        contact_id:int
        first_name:str
        last_name:str
        user_name:str
    
    [@app](http://twitter.com/app).get("/")
    def home():
        return {"Hello": "FastAPI"}
    
    [@app](http://twitter.com/app).post('/contact', response_model=ContactOut)
    async def create_contact(contact: Contact):
        return contact
    
    나는 거의 Contact 클래스의 복사본인 Contact Out이라는 다른 클래스를 추가했다.유일하게 다른 것은 여기에 비밀번호 필드가 없다는 것이다.이를 사용하기 위해 post decorator의response model 매개 변수에서 지정합니다.이렇게이제 같은 URL을 클릭해도 암호 필드가 반환되지 않습니다.

    보시다시피 여기에 보이는 암호 필드가 없습니다.만약/docs의 URL을 주의한다면, 너도 그것이 거기에 있는 것을 볼 수 있을 것이다.

    여러 가지 방법에서 서로 다른 응답 모델을 사용하고 싶다면, 서로 다른 응답 모델을 사용하는 것이 가능하지만, 기밀 정보를 한 방법에서만 생략하고 싶다면, decorator에서 Response Model exclude 파라미터를 사용할 수도 있습니다.
    [@app](http://twitter.com/app).post('/contact', response_model=Contact, response_model_exclude={"password"})
    async def create_contact(contact: Contact):
        return contact
    
    출력은 유사할 것입니다.response model 및 response model exclude를 설정합니다.결과는 같다.API 끝점에 메타데이터를 첨부할 수도 있습니다.
    [@app](http://twitter.com/app).post('/contact', response_model=Contact, response_model_exclude={"password"},description="Create a single contact")
    async def create_contact(contact: Contact):
        return contact
    
    문서에서 볼 수 있도록 이 단점에 대한 설명을 추가했습니다.

    FastapI 문서의 놀라운 점은 이것뿐만이 아닙니다. 모델의 예시적인 JSON 구조를 설정할 수 있습니다.
    class Contact(BaseModel):
        contact_id:int
        first_name:str
        last_name:str
        user_name:str
        password:str
    
    class Config:
            schema_extra = {
                "example": {
                    "contact_id": 1,
                    "first_name": "Jhon",
                    "last_name": "Doe",
                    "user_name": "jhon_123",
                }
            }
    
    네가 이렇게 할 때 그것은 다음과 같이 나타난다.

    FastapI의 오류 처리


    너는 항상 필요한 정보를 얻지 못할 수도 있다.FastapI는 이러한 상황을 처리하기 위해 HTTPException 클래스를 제공합니다.
    [@app](http://twitter.com/app).get("/contact/{id}", response_model=Contact, response_model_exclude={"password"},description="Fetch a single contact")
    async def contact_details(id: int):
        if id < 1:
            raise HTTPException(status_code=404, detail="The required contact details not found")
        contact = Contact(contact_id=id, first_name='Adnan', last_name='Siddiqi', user_name='adnan1', password='adn34')
        return contact
    
    간단한 단점이것은 id에 따라 연락처의 상세한 정보를 되돌려줍니다. 만약 id가 1보다 작으면 404 오류 메시지와 상세한 정보를 되돌려줍니다.
    내가 떠나기 전에, 내가 너에게 사용자 정의 제목을 어떻게 보내는지 알려줄게.
    from fastapi import FastAPI, HTTPException, Response
    
    [@app](http://twitter.com/app).get("/contact/{id}", response_model=Contact, response_model_exclude={"password"},
             description="Fetch a single contact")
    async def contact_details(id: int, response: Response):
        response.headers["X-LOL"] = "1"
        if id < 1:
            raise HTTPException(status_code=404, detail="The required contact details not found")
        contact = Contact(contact_id=id, first_name='Adnan', last_name='Siddiqi', user_name='adnan1', password='adn34')
        return contact
    
    응답 클래스를 가져온 후, 나는 리퀘스트 형식의 리퀘스트 파라미터를 전달하고, 헤더 X-LOL을 설정했다
    curl 명령을 실행하면 다음과 같이 표시됩니다.

    제목에서 x-lol을 찾을 수 있습니다.큰 소리로 웃어라!

    결론


    따라서 본고에서는fastAPI를 사용하여 고성능 API를 구축하는 방법을 이해했습니다.우리는 이미 Flask라는 최소 프레임워크를 가지고 있지만,Fast API의 비동기적인 지원은 현대 생산 시스템에 매우 매력적이다. 특히 REST API를 통해 접근하는 기계 학습 모델을 통해 더욱 그렇다.나는 그것의 표면에만 닿았다.너는 official FastAPI 사이트에서 그것을 더욱 잘 이해할 수 있다.
    다음 글에서 데이터베이스와의 통합, 신분 검증과 다른 고급 주제를 토론하고자 합니다.
    최초는 2021년 1월 23일에 http://blog.adnansiddiqi.me에 발표되었다.

    좋은 웹페이지 즐겨찾기