플라스크 사용자를 위한 FastAPI
42230 단어 machinelearningflaskpythonwebdev
나는 최근에 플라스크를 생산하는 프로젝트를 이식함으로써 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을 참조하십시오.
연결
만약 당신이 이 박문을 좋아한다면, 언제든지 저에게 연락 주십시오. 저는 매주 그곳에서 새로운 박문을 공유할 것입니다.
Reference
이 문제에 관하여(플라스크 사용자를 위한 FastAPI), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/amitness/fastapi-for-flask-users-1bg4텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)