Create your first REST API in FastAPI -번역

FastAPI에서 첫 번째 REST API 만들기

Python에서 고성능 API를 만드는 단계별 가이드

Photo by on

이 포스트에서는FastAPI: Rest API를 생성하기위한 Python 기반 프레임 워크입니다.이 프레임 워크의 몇 가지 기본 기능을 간략하게 소개 한 다음 연락처 관리 시스템을위한 간단한 API 세트를 만들겠습니다.이 프레임 워크를 사용하려면 Python에 대한 지식이 매우 필요합니다.

FastAPI 프레임 워크를 논의하기 전에 REST 자체에 대해 조금 이야기 해 보겠습니다.

Wikipedia에서 :

REST (Representational State Transfer)웹 서비스를 만드는 데 사용할 제약 조건 집합을 정의하는 소프트웨어 아키텍처 스타일입니다.RESTful 웹 서비스라고하는 REST 아키텍처 스타일을 따르는 웹 서비스는 인터넷에서 컴퓨터 시스템 간의 상호 운용성을 제공합니다.RESTful 웹 서비스를 사용하면 요청 시스템이 일관되고 사전 정의 된 상태 비 저장 작업 집합을 사용하여 웹 리소스의 텍스트 표현에 액세스하고 조작 할 수 있습니다.SOAP 웹 서비스와 같은 다른 종류의 웹 서비스는 자체 임의의 작업 집합을 노출합니다. [1]

FastAPI 프레임 워크 란 무엇입니까?

공식에서:

FastAPI는 표준 Python 유형 힌트를 기반으로 Python 3.6 이상으로 API를 빌드하기위한 최신의 빠른 (고성능) 웹 프레임 워크입니다.

네, 그렇습니다,d 그것은의 상자 지원 때문입니다비동기의 특징Python 3.6 이상이것이 최신 버전의 Python을 사용하는 것이 권장되는 이유입니다.

Image for post

FastAPI는Flask 및 DRF와 같은 기존 프레임 워크에 만족하지 않았습니다.더 많은 것을 배울 수 있습니다.웹 사이트에 언급 된 주요 기능 중 일부는 다음과 같습니다.

  • 빠른: 매우 높은 성능, 동급NodeJS가다(Starlette와 Pydantic에게 감사드립니다)..
  • 빠른 코딩: 기능 개발 속도를 약 200 % ~ 300 % 증가시킵니다.*
  • 버그 감소: 인간 (개발자)이 유발하는 오류를 약 40 % 감소시킵니다.*
  • 직관적: 훌륭한 편집기 지원.어디에서나 완성.디버깅 시간 단축.
  • 쉬운: 사용하고 배우기 쉽도록 설계되었습니다.문서를 읽는 시간이 줄어 듭니다.
  • 짧은: 코드 중복을 최소화합니다.각 매개 변수 선언의 여러 기능.더 적은 버그.
  • 건장한: 프로덕션 준비 코드를 가져옵니다.자동 대화 형 문서.
  • 표준 기반: API (Open API)에 대한 개방형 표준 기반 (완전히 호환 가능)

FastAPI의 제작자는 거인의 어깨에 서서 다음과 같은 기존 도구와 프레임 워크를 사용했다고 믿었습니다.

Installation and Setup

나는 사용할거야API 개발 환경을 설정합니다.Pipenv를 사용하면 컴퓨터에 설치된 항목에 관계없이 개발 환경을 쉽게 격리 할 수 있습니다.또한 컴퓨터에 설치된 것과 다른 Python 버전을 선택할 수 있습니다.그것은 사용합니다Pipfile모든 프로젝트 관련 종속성을 관리합니다.여기서 Pipenv를 자세히 다루지 않을 것이므로 프로젝트에 필요한 명령 만 사용합니다.

다음을 실행하여 PyPy를 통해 Pipenv를 설치할 수 있습니다.pip 설치 pipenv

pipenv 설치 --python 3.9

설치가 완료되면 다음 명령을 실행하여 가상 환경을 활성화 할 수 있습니다.pipenv 쉘

Image for post

당신은 또한 실행할 수 있습니다pipenv 설치 --three여기서 3은 Python 3.x를 의미합니다.

설치가 완료되면 다음 명령을 실행하여 가상 환경을 활성화 할 수 있습니다.pipenv 쉘

먼저FastAPI다음 명령을 실행합니다.pipenv 설치 fastapi

Image for post

그것은pipenv, 핍이 아닙니다.쉘에 들어가면 다음을 사용할 것입니다.pipenv.기본적으로 pip를 사용하고 있지만 모든 항목은Pipfile.그만큼Pipfile아래와 같이 보일 것입니다.

이제 개발 환경을 설정했습니다.이제 첫 번째 API 엔드 포인트 작성을 시작할 때입니다.다음과 같은 파일을 생성하겠습니다.main.py.이것이 우리 앱의 진입 점이 될 것입니다.

fastapi에서 가져 오기 FastAPI앱 = FastAPI ().가져 오기("/")
def home () :
return { "Hello": "FastAPI"}

Flask에서 작업 한 적이 있다면 거의 비슷할 것입니다.필요한 라이브러리를 가져온 후인스턴스를 만들고 데코레이터로 첫 번째 경로를 만들었습니다.

이제 어떻게 실행하는지 궁금합니다.음, FastAPI는ASGI 서버입니다.당신은 단순히 명령을 실행합니다uvicorn main : app --reload

파일 이름 (본관이 경우 .py) 및 클래스 객체 (이 경우) 서버를 시작합니다.나는-재 장전변경 될 때마다 자동으로 다시로드되도록 플래그를 지정합니다.

Image for post

방문http://localhost:8000/JSON 형식으로 메시지가 표시됩니다.{ "Hello": "FastAPI"}

멋지죠?

FastAPI는 API 문서 엔진도 제공합니다.방문하면http://localhost:8000/docsSwagger UI 인터페이스를 사용하고 있습니다.

Image for post

또는 멋진 것이 필요하면 방문하십시오

Image for post

FastAPI는 다음과 같은 API 엔드 포인트의 OpenAPI 버전도 제공합니다.

Path and Parameters

앞으로 나아 갑시다.다른 API 엔드 포인트를 추가합니다.ID로 연락처 세부 정보를 가져 오는 것입니다.

.get ( "/ contact / {contact_id}")
def contact_details (contact_id : int) :
{ 'contact_id': contact_id} 반환

여기에 방법이 있습니다.contact_details그것은 단지 받아들입니다int매개 변수를 그대로 반환합니다.dict체재.이제 다음을 통해 액세스 할 때곱슬 곱슬하다다음과 같습니다.

Image for post

이제 정수 대신 문자열을 전달하면 어떻게 될까요?아래 내용이 표시됩니다.

Image for post

당신은 그것을 볼 않았다?잘못된 데이터 유형을 보냈다는 오류 메시지를 리턴했습니다.그런 사소한 일에 대해서는 유효성 검사기를 작성할 필요가 없습니다.그것이 일하는 동안의 아름다움입니다FaastAPI.

쿼리 문자열

쿼리 문자열 형태로 추가 데이터를 전달하면 어떻게됩니까?예를 들어 API 끝점은 많은 레코드를 반환하므로 페이지 매김이 필요합니다.음, 문제 없습니다. 해당 정보도 가져올 수 있습니다.

먼저선택 과목유형:

import 입력에서

.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}

여기에서 다른 매개 변수를 전달했습니다.페이지유형을 설정선택 사항 [int]여기.선택 사항이며 이름에서 알 수 있습니다.선택 과목매개 변수.유형 설정int정수 값만 받아들이도록하는 것입니다. 그렇지 않으면 위에서했던 것처럼 오류가 발생합니다.

URL에 액세스http://127.0.0.1:8000/contact/1?page=5다음과 같은 내용이 표시됩니다.

Image for post

멋지죠?

지금까지 우리는 수동으로dict.시원하지 않습니다.단일 값을 입력하고 YUUGE JSON 구조를 반환하는 것은 매우 일반적입니다.FastAPI는이를 처리하는 우아한 방법을 제공합니다..

Pydantic모델은 실제로 데이터 유효성 검사에 도움이됩니다. 그게 무슨 뜻입니까?전달되는 데이터가 유효한지 확인하고 그렇지 않으면 오류를 반환합니다.우리는 이미 Python의 유형 힌트를 사용하고 있으며 이러한 데이터 모델은 삭제 된 데이터가 통과되도록합니다.약간의 코드를 작성해 봅시다.이 목적을 위해 연락처 API를 다시 확장하겠습니다.

import 입력에서fastapi에서 가져 오기 FastAPI
pydantic import BaseModel에서
앱 = FastAPI ()
클래스 Contact (BaseModel) :
contact_id : int
first_name : str
last_name : str
user_name : str
암호 : str
.post ( '/ 연락처')
async def create_contact (연락처 : 연락처) :
반환 연락처

나는 수입했다BaseModelpydantic의 클래스.그 후, 저는BaseModel클래스에 3 개의 필드를 설정합니다.나는 또한 그것의 유형을 설정하고 있음을 주목하십시오.완료되면우편API 끝점 및접촉그것에 매개 변수.나는 또한 사용하고 있습니다비동기여기에 간단한 파이썬 함수를코 루틴.FastAPI는 즉시 지원합니다.

이동http://localhost:8080/docs다음과 같은 내용이 표시됩니다.

Image for post

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

Image for post

예상대로 방금 반환접촉JSON 형식의 개체.

아시다시피 암호를 포함하여 전체 모델을 JSON 형식으로 덤프합니다.암호가 일반 텍스트 형식이 아니더라도 의미가 없습니다.그래서 뭐 할까?답입니다.

응답 모델이란?

이름에서 알 수 있듯이응답 모델요청에 대한 응답을 보내는 동안 사용되는 모델입니다.기본적으로 방금 모델을 사용하면 모든 필드를 반환합니다.응답 모델을 사용하여 사용자에게 반환 할 데이터의 종류를 제어 할 수 있습니다.코드를 약간 변경해 보겠습니다.

클래스 Contact (BaseModel) :
contact_id : int
first_name : str
last_name : str
user_name : str
암호 : str
ContactOut (BaseModel) 클래스 :
contact_id : int
first_name : str
last_name : str
user_name : str
.가져 오기("/")
def home () :
return { "Hello": "FastAPI"}
.post ( '/ contact', response_model = ContactOut)
async def create_contact (연락처 : 연락처) :
반환 연락처

다른 수업을 추가했습니다.ContactOut거의 사본입니다접촉수업.여기서 다른 점은암호들.그것을 사용하기 위해, 우리는 그것을response_model매개 변수우편데코레이터.그게 다야.이제 동일한 URL을 실행하면 암호 필드가 반환되지 않습니다.

Image for post

보시다시피 여기에는 비밀번호 필드가 표시되지 않습니다.눈치 채면/ docsURL도 볼 수 있습니다.

Image for post

여러 방법으로 사용하려는 경우 다른 응답 모델을 사용하는 것이 가능하지만 단일 방법에서 기밀 정보를 생략하려는 경우에는 다음을 사용할 수도 있습니다.response_model_exclude데코레이터의 매개 변수.

.post ( '/ contact', response_model = 연락처, response_model_exclude = { "password"})
async def create_contact (연락처 : 연락처) :
반환 연락처

출력은 비슷합니다.당신은response_modelresponse_model_exclude여기.결과는 동일합니다.API 엔드 포인트에 메타 데이터를 연결할 수도 있습니다.

.post ( '/ contact', response_model = 연락처, response_model_exclude = { "password"}, description = "단일 연락처 만들기")
async def create_contact (연락처 : 연락처) :
반환 연락처

문서에서 볼 수있는이 엔드 포인트에 대한 설명을 추가했습니다.

Image for post

FastAPI 문서의 우수성은 여기서 끝나지 않으며 모델의 예제 JSON 구조를 설정할 수도 있습니다.

클래스 Contact (BaseModel) :
contact_id : int
first_name : str
last_name : str
user_name : str
암호 : str
클래스 구성 :
schema_extra = {
"예": {
"contact_id": 1,
"first_name": "존",
"last_name": "미상",
"user_name": "jhon_123",
}
}

그렇게하면 다음과 같이 렌더링됩니다.

Image for post

FastAPI에서 오류 처리

필요한 정보를 얻지 못할 수도 있습니다.FastAPI는HTTPException그러한 상황을 다루는 수업.

.get ( "/ contact / {id}", response_model = Contact, response_model_exclude = { "password"}, description = "단일 연락처 가져 오기")
async def contact_details (id : int) :
ID & lt;1:
HTTPException (status_code = 404, detail = "필요한 연락처 정보를 찾을 수 없음")
연락처 = 연락처 (contact_id = id, first_name = 'Adnan', last_name = 'Siddiqi', user_name = 'adnan1', password = 'adn34')
반환 연락처

A simple endpoint. It returns contact details based on the id. If the 신분증1보다 작 으면 a를 반환합니다.404세부 사항이있는 오류 메시지.

떠나기 전에 사용자 지정 헤더를 보내는 방법을 알려 드리겠습니다.

fastapi에서 가져 오기 FastAPI, HTTPException, 응답.get ( "/ contact / {id}", response_model = 연락처, response_model_exclude = { "password"},
description = "단일 연락처 가져 오기")
async def contact_details (id : int, response : Response) :
response.headers["X-LOL"] = "1"
ID & lt;1:
HTTPException (status_code = 404, detail = "필요한 연락처 정보를 찾을 수 없음")
연락처 = 연락처 (contact_id = id, first_name = 'Adnan', last_name = 'Siddiqi', user_name = 'adnan1', password = 'adn34')
반환 연락처

가져온 후Response내가 통과 한 수업의뢰유형의 매개 변수의뢰헤더를 설정X-LOL

After running the curl command you will see something like the below:

Image for post

You can find x-lol헤더 중.LOL!

Conclusion

따라서이 게시물에서는 고성능 API를 빌드하기 위해 FastAPI를 사용하는 방법을 배웠습니다.우리는 이미 Flask라는 최소한의 프레임 워크를 가지고 있지만 FastAPI의 비동기 지원은 REST API를 통해 액세스되는 기계 학습 모델과 같은 최신 프로덕션 시스템에 매우 매력적입니다.나는 그 표면을 긁었다.자세한 내용은웹 사이트.

다음 포스트에서는 DB와의 통합, 인증 등과 같은 몇 가지 고급 주제에 대해 논의 할 것입니다.

Originally published at on January 23, 2021.

Leave a Comment