Flask에서 FastAPI로 원활하게 마이그레이션

더 나은 성능과 유지 관리를 위해 Flask 서버를 전환하십시오.

저자가 제공 한 이미지.

이 글을 읽으면 FastAPI에서에서 로의 전환과 관련된 기본 개념 과 단계에 대해 배울 FlaskFastAPI있습니다. 참조를 위해 나란히 비교가 제공됩니다. 이 자습서가 끝나면 Flask서버를 완전히 서버 로 마이그레이션 할 수 있습니다 FastAPI. 에 기초 공식 문서 , FastAPI프레임 워크는 다음과 같습니다

"… 표준 Python 유형 힌트를 기반으로 한 Python 3.6 이상으로 API를 빌드하기위한 현대적이고 빠른 (고성능) 웹 프레임 워크입니다."

아시다시피 Flask100 % WSGI (Web Server Gateway Interface) 인 마이크로 웹 프레임 워크입니다 . 나아가, (비동기 서버 게이트웨이 인터페이스)의 영적 후계자 로 에 대한 지원과 IO 바운드 상황에서 높은 처리량을 달성 할 수 및 처리 할 수 없습니다 . ASGI WSGIASGIHTTP/2WebSocketsWSGI

기술의 발전과 함께 번개처럼 빠른 ASGI서버 Uvicorn가 탄생했습니다. 그러나 Uvicorn라우팅 기능이없는 웹 서버 일뿐입니다. 그런 다음, Starlette완전한 제공하는, 함께 온 ASGI위쪽에 도구 키트를 ASGI같은 서버 Uvicorn, Daphne또는 Hypercorn. 당신이 직접 비교를 찾고 있다면, Starlette입니다 ASGI동안 웹 프레임 워크 FlaskA는 WSGI웹 프레임 워크.

FastAPI프레임 워크는 뒤에 기능의 전체를 사용하게 Starlette와의 프로그래밍 스타일 Flask플라스 크 -처럼 만드는 ASGI웹 프레임 워크를. 또한 RESTful API를 만들기위한 이상적인 웹 프레임 워크를 만드는 다음 기능을 통합합니다.

  • 데이터 유효성 검사 : Pydantic런타임에 유형 힌트를 적용하는 데 사용 합니다. 또한 데이터가 유효하지 않은 경우 사용자 친화적 인 오류를 제공합니다.
  • 문서 : JSON 스키마를 사용하여 자동 데이터 모델 문서를 지원합니다. 와 함께 제공됩니다 Swagger UIReDoc.

다음 섹션으로 진행하여 필요한 모듈 설치를 시작하겠습니다.

1. 설정

설치를 계속하기 전에 가상 환경을 만드는 것이 좋습니다. FastAPI를 테스트하려는 경우 FastAPIUvicorn. 나머지 패키지는 선택 사항이며이 자습서를 따르려는 경우에만 필요합니다.

FastAPI

설치는을 통해 매우 간단합니다 pip install.

pip install fastapi

권장되는 ASGI서버는 FastAPI입니다 Uvicorn. 다음 명령을 실행하여 설치하십시오.

pip install uvicorn

템플릿을 FastAPI통해 웹 페이지를 제공하려는 경우 모든 템플릿 엔진을 사용할 수 있습니다 . 간단히하기 위해 Jinja2Flask에서 사용하는 것과 동일한 템플릿 엔진을 설치해 보겠습니다 .

pip install jinja2

사용자에게 정적 파일을 제공해야하는 경우 aiofiles에도 설치해야합니다 .

pip install aiofiles

기본적으로 FastAPI입력 요청을 JSON으로 표준화합니다. 양식 필드를 받아야하는 경우를 설치해야 python-multipart합니다.

pip install python-multipart

이 자습서에서는 .NET을 사용하는 Flask서버와 동등한 기능을 모두 보여줍니다 FastAPI. 참조를 위해 나란히 비교를 수행하려는 경우에만 Flask를 설치하십시오. 그렇지 않으면이 모듈을 무시하고 FastAPI대신 서버를 실행할 수 있습니다 .

pip install flask

2. 비교

이 섹션에서는 Flask서버와 FastAPI서버에 대한 설명과 함께 코드가 제공됩니다 . 두 서버 모두 동일한 API와 기능을 갖습니다.

가져 오기 (Flask)

가져 오기 선언은 Flask모든 것이 Flask 패키지 아래에 번들로 제공되므로 매우 간단 합니다. random모듈 이후의 API 중 하나의 난수를 생성하는 데 사용된다.

from flask import Flask, request, jsonify, render_template, send_from_directory
import random

반면에 import 문은 FastAPI. 다음 코드 조각에는 양식 필드 입력에 대한 지원과 다양한 종류의 응답을 반환하는 지원이 포함됩니다. 또한 템플릿 엔진을 통해 정적 파일과 HTML 파일을 제공 할 수도 있습니다.

최소한의 import 문을 찾고 있다면 다음과 같이 보일 것입니다.

from fastapi import FastAPI
from pydantic import BaseModel
import random   # needed for generating a random number for an API
import uvicorn  # optional if you run it directly from terminal

초기화 코드는 Flask다음과 같이 간단합니다. Flask정적 파일과 템플릿 엔진을 모두 처리합니다.

app = Flask(__name__)

표준 초기화 외에도 정적 파일을 제공하기위한 경로를 마운트해야합니다. 마찬가지로 템플릿 엔진을 통해 렌더링 할 변수를 선언해야합니다. 대부분의 초기화 코드는 Pydantic구문을 기반으로 데이터 모델 클래스를 만드는 데 사용됩니다 .

Hello World (Flask)

사용자에게 문자열을 반환하는 경로를 생성하는 다음 코드 스 니펫을 살펴 보겠습니다.

@app.route('/')
def hello():
    return "Hello World!"

에 대한 "Hello World"함수에 해당하는 FastAPI것은 다음과 같습니다. 기본적으로 JSON을 응답으로 반환합니다. 따라서 문자열을 반환 하려면 response_classto PlainTextResponse를 변경해야 합니다.

async필수는 아니지만 비동기 코드로 작업하는 것이 훨씬 쉬워집니다. 비동기를 지원하지 않는 코드를 다루지 않는 한 정의하는 것이 좋습니다.

@app.get("/", response_class=PlainTextResponse)
async def hello():
    return "Hello World!"

임의로 생성 된 숫자를 반환하는 API가 있다고 가정 해 보겠습니다. 코드는 Flask서버 에서 다음과 같아야 합니다.

@app.route('/random-number')
def random_number():
    return str(random.randrange(100))

FastAPI다음과 같이 서버를 쉽게 수정할 수 있습니다 .

@app.get('/random-number', response_class=PlainTextResponse)
async def random_number():
    return str(random.randrange(100))

다음으로, 호출 된 쿼리 매개 변수를 받아들이고 text결과로 JSON을 반환 하는 API를 테스트 할 것 입니다. Flask에서 메서드는 경로 데코레이터를 통해 설정됩니다. 이 경우 GET요청 만 수락하도록 설정합니다 .

@app.route('/alpha', methods=['GET'])
def alpha():
    text = request.args.get('text', '')
result = {'text': text, 'is_alpha' : text.isalpha()}
return jsonify(result)

HTTP 메서드는 데코레이터와 함께 처음부터 바로 정의됩니다. FastAPI용어 로는 연산이라고합니다 . 들어 GET작동, 당신은 그것을 호출해야합니다 app.get. 동일한 기능을 가진 여러 HTTP 메서드의 경우 논리를 함수 내부에 래핑하고 각 작업에서 독립적으로 호출해야합니다.

쿼리 매개 변수는 유형 힌트와 함께 지정해야합니다. text: str라는 필수 문자열 쿼리 매개 변수를 나타냅니다 text. 여기에 기본값을 지정 text = ‘text’하여 선택적 매개 변수로 만들 수 있습니다.

@app.get('/alpha')
async def alpha(text: str):
    result = {'text': text, 'is_alpha' : text.isalpha()}
return result

대부분의 경우 POST데이터베이스에 새 데이터를 추가하라는 요청이 있습니다. 두 개의 양식 필드를 받아 JSON 결과를 반환하는 다음 예제를 살펴 보겠습니다.

새 사용자 만들기 (FastAPI)

POST작업은 app.post데코레이터 를 통해 처리됩니다 . Form(…)기본 구현이 JSON 또는 쿼리 매개 변수를 기반으로하므로 입력 매개 변수를 선언 할시기를 지정해야합니다 .

언어 업데이트 (Flask)

지금까지 쿼리 매개 변수와 양식 필드를 모두 다루었습니다. languageJSON 입력을 기반으로 호출되는 변수를 업데이트하는 또 다른 예를 살펴 보겠습니다 . 기존 데이터를 업데이트하려면 PUT방법 을 사용하는 것이 좋습니다 . PUT메소드를 직접 지정하는 대신 다음 코드 스 니펫은 조건문을 통해이를 수행하는 방법을 보여줍니다.

언어 업데이트 (FastAPI)

마찬가지로, PUT작업은 app.put데코레이터 를 통해 호출됩니다 . 초기화하는 동안 다음 클래스를 선언했습니다.

class Item(BaseModel):
    language = 'english'

@app.put('/update-language', response_class=PlainTextResponse)
async def update_language(item: Item):
    language = item.language
return "Successfully updated language to %s" % (language)

Jinja2템플릿 엔진을 사용하기 때문에 Flask에서 HTML 웹 페이지를 제공하는 것은 비교적 간단 합니다. 템플릿이라는 폴더 안에 HTML 파일을 선언하기 만하면됩니다. 정적 파일을 제공하는 경우 static이라는 폴더에 포함해야합니다.

다음 예제는 index.html. 변수는 다음과 같이 입력 매개 변수로 전달할 수 있습니다.

@app.route('/get-webpage', methods=['GET'])
def get_webpage():
    return render_template('index.html', message="Contact Us")

초기화하는 동안 static정적 파일을 제공 하는 폴더를 마운트했습니다.

app.mount("/static", StaticFiles(directory="static"), name="static")

templates = Jinja2Templates(directory="templates")

Request 자체 맞춤 매개 변수와 함께 템플릿을 반환해야합니다.

@app.get('/get-webpage', response_class=HTMLResponse)
async def get_webpage(request: Request):
    return templates.TemplateResponse("index.html", {"request": request, "message": "Contact Us"})

사용자에게 파일을 반환하는 권장 방법은 내장 send_from_directory()함수를 사용하는 것입니다. 특히 경로 나 파일은 사용자 입력에서 가져옵니다. 두 가지 주요 입력을받습니다.

  • 파일이있는 경로
  • 파일의 이름

다음 구문을 사용하여 경로 매개 변수를 지정할 수 있습니다 <type:variable_name>. 이 경우 <string:language>.

@app.route('/get-language-file/<string:language>', methods=['GET'])
def get_language_file(language):
    return send_from_directory('./static/language', language + '.json', as_attachment=True)

FastAPIResponse요구 사항과 요구 사항에 따라 많은 유형 이 제공됩니다 . 파일을 반환 들어, 사용하도록 선택할 수 있습니다 FileResponse또는 StreamingResponse. 이 튜토리얼에서는 FileResponse. 다음 입력을 허용합니다.

  • path: 스트리밍 할 파일의 파일 경로입니다.
  • headers: 사전으로 포함 할 사용자 정의 헤더입니다.
  • media_type: 미디어 유형을 제공하는 문자열입니다. 설정하지 않으면 파일 이름 또는 경로가 미디어 유형을 유추하는 데 사용됩니다.
  • filename: 설정된 경우 응답에 포함됩니다 Content-Disposition.

메인 (플라스크)

Flask에서는 다음과 같이 주요 기능을 지정합니다.

if __name__ == '__main__':
    app.run('0.0.0.0',port=8000)

python myapp.py

의 경우 FastAPI가져와야합니다.uvicorn

import uvicorn

if __name__ == '__main__':
    uvicorn.run('myapp:app', host='0.0.0.0', port=8000)

python myapp.py

uvicorn myapp:app

  • reload: 파일을 수정할 때 서버를 새로 고치는 자동 새로 고침을 사용합니다. 지역 개발에 매우 ​​유용합니다.
  • port: 서버의 포트 번호입니다. 기본값은 8000입니다.

uvicorn myapp:app --reload --port 5000

서버 의 전체 코드 는 다음 요점 을 확인하십시오 Flask.

FastAPI 서버

다음 요점에는를 사용하는 동일한 기능에 대한 전체 코드가 포함되어 있습니다 FastAPI.

3. 문서

FastAPI서버를 실행하면 문서화를위한 두 개의 추가 경로에 액세스 할 수 있습니다.

Interactice Docs (Swagger UI)

첫 번째는에서 제공하는 대화 형 문서 Swagger UI입니다. 포트에서 서버를 실행 한 경우 8000다음 URL을 통해 액세스 할 수 있습니다.

http://localhost:8000/docs

작성자가 제공 한 스크린 샷.

API를 개별적으로 테스트 할 수있는 대화 형 문서입니다. /alpha경로 를 클릭하면 다음 인터페이스가 표시됩니다 .

작성자가 제공 한 스크린 샷.

"사용해보기"버튼을 클릭하고 텍스트 필드에 문자열을 입력합니다. 다음으로 "실행"버튼을 클릭하면 다음과 같은 결과가 표시됩니다.

작성자가 제공 한 스크린 샷.

ReDoc

또한에서 FastAPI제공하는 대체 문서가 함께 제공됩니다 ReDoc. 다음 URL을 통해 액세스 할 수 있습니다.

http://localhost:8000/redoc

작성자가 제공 한 스크린 샷.

4. 결론

오늘 배운 내용을 요약 해 보겠습니다.

.NET의 핵심 개념에 대한 간략한 배경과 설명으로 시작했습니다 FastAPI. 그런 다음 Flask및 .NET을 실행하는 데 필요한 모듈을 설치했습니다 FastAPI.

설치가 완료되면 HTTP 메서드, 입력 요청 및 출력 응답이 다른 몇 가지 API 구현을 테스트했습니다. 결과적으로 차이점을 확인하고 코드를 Flask에서 .NET 용 동일한 기능으로 이동하는 데 필요한 수정을 수행하는 방법을 배웠습니다 FastAPI.

이제 사용 사례에 따라 Flask서버를 FastAPI서버 로 마이그레이션하는 데 대한 기본 지식이 있어야합니다 .

참고

  1. Uvicorn Github 페이지
  2. Uvicorn 문서
  3. FastAPI Github 페이지
  4. FastAPI 문서

Suggested posts

Python으로 차트 주석 자동 생성

Python으로 차트 주석 자동 생성

따라서 매일 업데이트되는 최신의 아름다운 대화 형 대시 보드를 만들었으며 이제 경영진은 로그인하여 자신이 원할 때마다 판매 상황을 확인할 수 있습니다. 그러나 항상 그래프를 싫어하고 보고서에 숫자를 제공하기를 원하는 사람들이 있습니다. 그들은 차트를 클릭하지 않을 것입니다.

Express.js 시작하기

Express.js 시작하기

Express는 웹 및 모바일 앱을 만드는 경험을 즐겁게 만드는 기능 세트가 포함 된 Node.js 프레임 워크입니다.

Related posts

"실용적인 프로그래머"의 5 가지 필수 사항

역대 베스트셀러 코딩 북의 요점

"실용적인 프로그래머"의 5 가지 필수 사항

Pragmatic Programmer는 1999 년에 처음 출판되었으며 이후 역대 최고의 프로그래밍 책으로 선정되었습니다. 저자 Andy Hunt와 David Thomas는 Agile Manifesto의 원저자 중 하나였으며 몇 가지 심각한 자격을 가지고 있습니다.

대규모 GraphQL 쿼리 공격으로부터 보호

공격자가 공개적으로 사용 가능한 GraphQL 인터페이스를 사용하여 사이트를 스크랩하거나 서비스 거부 공격을 실행하는 방법에 대해 알아보십시오. 이들은 4 가지 방법 중 하나로이를 수행 할 수 있습니다. 단일 대형 쿼리를 신중하게 구성하여 실행하고, 관련 데이터를 가져올 수있는 병렬 쿼리를 많이 작성하고, 일괄 요청을 사용하여 많은 쿼리를 연속적으로 실행하고, 마지막으로 많은 요청을 보냅니다.

기술 인터뷰의 사회적 구성 요소

코딩 문제는 스트레스가 많지만 스트레스에 대한 당신의 반응은 당신의 기술적 능력보다 더 크게 말합니다.

기술 인터뷰의 사회적 구성 요소

기술 업계의 직책을 위해 인터뷰 할 때 일반적으로 제안을 고려하기 전에 최소한 3 차례의 인터뷰를 거치게됩니다. 라운드는 일반적으로 다음과 같습니다. 그렇게 생각하면 잘못된 것입니다.

훌륭한 개발자의 3 가지 행동 특성

훌륭한 개발자의 3 가지 행동 특성

훌륭한 개발자를 만드는 비 기술적 인 것들 나는이 기사를 작성하는 것을 한동안 미루고 있습니다. 나는 그것을 작성할 자격이 있다고 생각하지 못했습니다. 오늘은 쓸 때라고 생각했습니다.