플라스크 사용자를 위한 FastAPI

Flask는 이미 머신러닝 프로젝트에서 API 개발의 사실상 선택이 되었지만 새로운 프레임워크를 FastAPI라고 하는데 이것은 이미 많은 지역 사회의 관심을 받았다.

나는 최근에 플라스크를 생산하는 프로젝트를 이식함으로써 FastAPI의 발전을 추진하기로 결정했다.플라스크에서 FastAPI를 추출하는 것은 매우 쉬우며 몇 시간 안에 시작하고 실행할 수 있습니다.
자동 데이터 검증, 문서 생성과 최선의 실천(예를 들어pydantic 모델과python 유형)의 추가 장점은 이를 미래 프로젝트의 유력한 선택으로 만든다.
본고에서 저는 Flask와 FastAPI에서 흔히 볼 수 있는 여러 가지 용례의 실현을 비교하여 FastAPI를 소개하겠습니다.
버전 정보:
본문을 작성할 때 플라스크 버전 1.1, FastAPI 버전 0.58.1

설치


PyPI에서 플라스크와 FastAPI를 모두 사용할 수 있습니다.conda의 경우 conda-forge 채널을 사용하여 FastAPI를 설치해야 합니다. FastAPI는 Flask의 기본 채널에서 사용할 수 있습니다.
병:
pip install flask
conda install flask
FastAPI:
pip install fastapi uvicorn
conda install fastapi uvicorn -c conda-forge

"Hello World" 실행


병:
# app.py
from flask import Flask

app = Flask(__name__)

@app.route('/')
def home():
    return {'hello': 'world'}

if __name__ == '__main__':
    app.run()
이제 다음 명령을 사용하여 개발 서버를 실행할 수 있습니다.기본적으로 포트 5000에서 실행됩니다.
python app.py
FastAPI
# app.py
import uvicorn
from fastapi import FastAPI

app = FastAPI()

@app.get('/')
def home():
    return {'hello': 'world'}

if __name__ == '__main__':
    uvicorn.run(app)
FastAPI는 uvicorn이라는 운영 준비 서버로 서비스를 연기합니다.기본 포트가 8000인 개발 모드에서 실행할 수 있습니다.
python app.py

운영 서버


병:
# app.py
from flask import Flask

app = Flask(__name__)

@app.route('/')
def home():
    return {'hello': 'world'}

if __name__ == '__main__':
    app.run()
생산 서버에 대해 gunicorn은 플라스크에서 흔히 볼 수 있는 선택이다.
gunicorn app:app
FastAPI
# app.py
import uvicorn
from fastapi import FastAPI

app = FastAPI()

@app.get('/')
def home():
    return {'hello': 'world'}

if __name__ == '__main__':
    uvicorn.run(app)
FastAPI는 uvicorn이라는 운영 준비 서버로 서비스를 연기합니다.서버를 시작할 수 있습니다.
uvicorn app:app
열 다시 로드 모드에서 실행할 수도 있습니다
uvicorn app:app --reload
또한 포트를 변경할 수도 있습니다.
uvicorn app:app --port 5000
노동자의 수량도 조절할 수 있다.
uvicorn app:app --workers 2
다음 명령을 사용하여 uvicorn을 관리하는 데 gunicorn을 사용할 수 있습니다.노동자 수(-w)와 같은 일반적인 gunicorn 표지.
gunicorn -k uvicorn.workers.UvicornWorker app:app

HTTP 메서드


병:
@app.route('/', methods=['POST'])
def example():
    ...
FastAPI:
@app.post('/')
def example():
    ...
각 HTTP 방법에는 별도의 decorator 방법이 있습니다.
@app.get('/')
@app.put('/')
@app.patch('/')
@app.delete('/')

URL 변수


우리는 URL에서 사용자 id, 예를 들어 /users/1을 가져와서 사용자 id를 사용자에게 되돌려 주기를 희망합니다.
병:
@app.route('/users/<int:user_id>')
def get_user_details(user_id):
    return {'user_id': user_id}
FastAPI:
FastAPI에서는 Python의 유형 프롬프트를 사용하여 모든 데이터 유형을 지정합니다.예를 들어, 여기서 user_id은 정수여야 합니다.URL 경로의 변수도 f 문자열과 유사하게 지정됩니다.
@app.get('/users/{user_id}')
def get_user_details(user_id: int):
    return {'user_id': user_id}

질의 문자열 처리


우리는 사용자가 URL에서 검색 문자열 ?q=abc을 사용하여 검색어를 지정할 수 있도록 허용하기를 희망합니다.
병:
from flask import request

@app.route('/search')
def search():
    query = request.args.get('q')
    return {'query': query}
FastAPI:
@app.get('/search')
def search(q: str):
    return {'query': q}

JSON POST 요청


장난감 예시를 들겠습니다. 그 중에서 text 키가 있는 JSON POST 요청을 보내고 소문자 버전으로 돌아가기를 원합니다.
# Request
{"text": "HELLO"}

# Response
{"text": "hello"}
병:
from flask import request

@app.route('/lowercase', methods=['POST'])
def lower_case():
    text = request.json.get('text')
    return {'text': text.lower()}
FastAPI:
Flask에서만 기능을 복사하는 경우 FastAPI에서 다음을 수행할 수 있습니다.
from typing import Dict

@app.post('/lowercase')
def lower_case(json_data: Dict):
    text = json_data.get('text')
    return {'text': text.lower()}
그러나 FastAPI는 수신된 JSON 데이터에 비추는 Pydantic 모델을 만드는 새로운 개념을 도입했다.우리는 pydantic를 사용하여 상기 예시를 다음과 같이 재구성할 수 있습니다.
from pydantic import BaseModel

class Sentence(BaseModel):
    text: str

@app.post('/lowercase')
def lower_case(sentence: Sentence):
    return {'text': sentence.text.lower()}
그림에서 보듯이 JSON 데이터는 사전을 얻는 것이 아니라 패턴 Sentence의 대상으로 변환됩니다.따라서 우리는 데이터 속성(예를 들어 sentence.text)을 사용하여 데이터에 접근할 수 있다.이것은 또한 데이터 형식의 자동 검증을 제공한다.문자열 이외의 데이터를 보내려고 하면 인증 오류가 자동으로 생성됩니다.
잘못된 요청 예
{"text": null}
자동 응답
{
    "detail": [
        {
            "loc": [
                "body",
                "text"
            ],
            "msg": "none is not an allowed value",
            "type": "type_error.none.not_allowed"
        }
    ]
}

파일 업로드


업로드된 파일 이름을 되돌릴 API를 만듭니다.파일을 업로드할 때 사용하는 키는 file입니다.
병.
Flask를 사용하면 요청 객체를 통해 업로드된 파일에 액세스할 수 있습니다.
# app.py

from flask import Flask, request
app = Flask(__name__)

@app.route('/upload', methods=['POST'])
def upload_file():
    file = request.files.get('file')
    return {'name': file.filename}
FastAPI:
FastAPI는 함수 매개변수를 사용하여 파일 키를 지정합니다.
# app.py
from fastapi import FastAPI, UploadFile, File

app = FastAPI()

@app.post('/upload')
def upload_file(file: UploadFile = File(...)):
    return {'name': file.filename}

양식 제출


우리는 아래와 같이 정의된 텍스트 폼 필드에 접근하여 이 값을 표시하기를 희망합니다.
<input name='city' type='text'>
병.
Flask에서는 요청 객체를 통해 양식 필드에 액세스할 수 있습니다.
# app.py

from flask import Flask, request
app = Flask(__name__)

@app.route('/submit', methods=['POST'])
def echo():
    city = request.form.get('city')
    return {'city': city}
FastAPI:
우리는 함수 파라미터를 사용하여 폼 필드의 키와 데이터 형식을 정의합니다.
# app.py
from fastapi import FastAPI, Form
app = FastAPI()

@app.post('/submit')
def echo(city: str = Form(...)):
    return {'city': city}
우리는 또한 표 필드를 선택할 수 있도록 설정할 수 있다. 아래와 같다.
from typing import Optional

@app.post('/submit')
def echo(city: Optional[str] = Form(None)):
    return {'city': city}
이와 같이, 우리는 표 필드에 기본값을 설정할 수 있다. 아래와 같다.
@app.post('/submit')
def echo(city: Optional[str] = Form('Paris')):
    return {'city': city}

쿠키


우리는 요청에서 name이라는 쿠키를 방문하기를 희망합니다.
병.
Flask에서는 요청 객체를 통해 쿠키에 액세스할 수 있습니다.
# app.py

from flask import Flask, request
app = Flask(__name__)

@app.route('/profile')
def profile():
    name = request.cookies.get('name')
    return {'name': name}
FastAPI:
우리는 파라미터를 사용하여 쿠키의 키를 정의합니다.
# app.py
from fastapi import FastAPI, Cookie
app = FastAPI()

@app.get('/profile')
def profile(name = Cookie(None)):
    return {'name': name}

모듈식 뷰


우리는 하나의 응용 프로그램에서 보기를 분해하기를 바란다.별도의 파일로 복사합니다.
- app.py
- views
  - user.py
병:
Flask에서 우리는 청사진이라는 개념을 사용하여 이 점을 관리한다.우리는 먼저 사용자 보기에 대한 청사진을 작성합니다. 아래와 같습니다.
# views/user.py
from flask import Blueprint
user_blueprint = Blueprint('user', __name__)

@user_blueprint.route('/users')
def list_users():
    return {'users': ['a', 'b', 'c']}

그런 다음 뷰는 주 app.py 파일에 등록됩니다.
# app.py
from flask import Flask
from views.user import user_blueprint

app = Flask(__name__)
app.register_blueprint(user_blueprint)
FastAPI:
FastAPI에서 청사진의 등가물을 라우터라고 합니다.먼저 사용자 라우터를 다음과 같이 만듭니다.
# routers/user.py
from fastapi import APIRouter
router = APIRouter()

@router.get('/users')
def list_users():
    return {'users': ['a', 'b', 'c']}
그런 다음 다음과 같이 라우터를 주 응용 프로그램 객체에 연결합니다.
# app.py
from fastapi import FastAPI
from routers import user

app = FastAPI()
app.include_router(user.router)

데이터 검증


병.
Flask는 기존 입력 데이터 검증 기능을 제공하지 않습니다.사용자 정의 검증 논리를 작성하거나 marshmalllow 또는 pydantic 등 라이브러리를 사용하는 것은 흔히 볼 수 있는 방법이다.
FastAPI:
FastAPI는 pydantic를 프레임워크에 봉인하고pydantic 모드와python 형식 알림의 조합을 간단하게 사용하여 데이터 검증을 할 수 있습니다.
from fastapi import FastAPI
from pydantic import BaseModel

app = FastAPI()

class User(BaseModel):
    name: str
    age: int

@app.post('/users')
def save_user(user: User):
    return {'name': user.name,
            'age': user.age}
이 코드는 name이 문자열이고 age이 정수인지 확인하기 위해 자동 검증을 실행합니다.다른 데이터 형식을 보내면 관련 메시지가 있는 검증 오류가 자동으로 생성됩니다.
다음은 흔히 볼 수 있는pydantic 모드의 예입니다.

예 1: 키 값 쌍


{
  "name": "Isaac",
  "age": 60
}
from pydantic import BaseModel

class User(BaseModel):
    name: str
    age: int

예2: 아이템 수집


{
  "series": ["GOT", "Dark", "Mr. Robot"]
}
from pydantic import BaseModel
from typing import List

class Metadata(BaseModel):
    series: List[str]

예 3: 중첩된 객체


{
  "users": [
    {
      "name": "xyz",
      "age": 25
    },
    {
      "name": "abc",
      "age": 30
    }
  ],
  "group": "Group A"
}
from pydantic import BaseModel
from typing import List

class User(BaseModel):
    name: str
    age: int

class UserGroup(BaseModel):
    users: List[User]
    group: str
here에서 Python 유형 프롬프트에 대한 자세한 내용을 확인할 수 있습니다.

자동 문서


병.
Flask는 문서 생성을 위한 내장 기능을 제공하지 않습니다.이 공백을 메우기 위해 flask-swagger 또는 flask-restful과 같은 확장이 있지만 작업 절차는 상대적으로 복잡하다.
FastAPI:
FastAPI는 /docs곳에서 상호작용식 swagger 문서 단점을 자동으로 생성하고 /redoc곳에서 참고 문서를 자동으로 생성합니다.
예를 들어 우리가 아래에 간단한 보기를 제시했다고 가정하면 사용자가 검색한 내용을 반영한다.
# app.py
from fastapi import FastAPI

app = FastAPI()

@app.get('/search')
def search(q: str):
    return {'query': q}

거들먹거리는 문서


서버를 실행하고 단점 http://127.0.0.1:8000/docs으로 이동하면 자동으로 생성된 swagger 문서를 얻을 수 있습니다.

브라우저 자체에서 상호작용으로 API를 시도할 수 있습니다.

ReDoc 문서


경매를 통과하는 것 외에 단점 http://127.0.0.01:8000/redoc으로 이동하면 자동으로 생성된 참고 문서를 얻을 수 있습니다.매개 변수, 요청 형식, 응답 형식, 상태 코드에 대한 정보가 있습니다.

소스 간 자원 공유(CORS)


병.
플라스크는 기존 CORS 지원을 제공하지 않습니다.다음과 같이 CORS를 구성하려면 flask-cors과 같은 확장을 사용해야 합니다.
# app.py

from flask import Flask
from flask_cors import CORS

app_ = Flask(__name__)
CORS(app_)
FastAPI:
FastAPI는 CORS를 처리하는 built-in middleware을 제공합니다.우리는 아래에 CORS 예시를 보여 주었는데, 그 중에서 우리는 모든 출처가 우리의 API에 접근할 수 있도록 허락했다.
# app.py
from fastapi import FastAPI
from fastapi.middleware.cors import CORSMiddleware

app = FastAPI()

app.add_middleware(
    CORSMiddleware,
    allow_origins=['*'],
    allow_credentials=True,
    allow_methods=["*"],
    allow_headers=["*"],
)

결론


따라서 FastAPI는 최선의 실천을 가진 건장한 API를 구축하는 플라스크의 좋은 대체품이다.자세한 내용은 documentation을 참조하십시오.

연결


만약 당신이 이 박문을 좋아한다면, 언제든지 저에게 연락 주십시오. 저는 매주 그곳에서 새로운 박문을 공유할 것입니다.

좋은 웹페이지 즐겨찾기