Рубрики
Без рубрики

Fastapi для пользователей колба

В то время как колба стала выбором де-факто для разработки API в машинном обучении проектам, есть … с меткой MachineLearning, WebDev, Python, Flask.

В то время как колба стала выбором де-факто для разработки API в проектах машинного обучения, появляется новая структура, называемая Fastapi, которая получила много общественных тяги.

Недавно я решил дать Fastapi вращение, портировав проект производственного колба. Было очень легко забрать Fastapi, исходя из колбы, и я смог добиться и бегать всего за несколько часов.

Добавлена польза от автоматической проверки данных, генерации документации и выпечки, таких как Pydantical Schemas и Python, делают это сильным выбором для будущих проектов.

В этом посте я введем Fastapi, противопоставляя реализацию различных общих случаев использования в колбе, так и Fastapi.

Информация о версии:

Во время этого письма версия Flask составляет 1.1.2, а версия fastapi составляет 0,58,1

Установка

Как колба, так и Fastapi доступны на Pypi. Для CODA вам нужно использовать Кондо-кузница Канал для установки Fastapi, пока он доступен в канале по умолчанию для колба.

Колбу:

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 дефект, служащих на сервере для производства, называемыми Увикурн Отказ Мы можем запустить его в режиме разработки с портом по умолчанию 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 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 app:app

Вы также можете запустить его в режиме Hot-Reload, запустив

uvicorn app:app --reload

Кроме того, вы также можете изменить порт.

uvicorn app:app --port 5000

Количество работников также может контролироваться.

uvicorn app:app --workers 2

Вы можете использовать боевик управлять UVicorn, используя следующую команду. Все регулярные флаги оружия, такие как количество работников ( -W ) работа.

gunicorn -k uvicorn.workers.UvicornWorker app:app

HTTP-методы

Колбу:

@app.route('/', methods=['POST'])
def example():
    ...

Fastapi:

@app.post('/')
def example():
    ...

У вас есть отдельные методы декоратора для каждого метода HTTP.

@app.get('/')
@app.put('/')
@app.patch('/')
@app.delete('/')

Переменные URL

Мы хотим получить идентификатор пользователя от URL например /пользователи/1 а затем верните идентификатор пользователя пользователю.

Колбу:

@app.route('/users/')
def get_user_details(user_id):
    return {'user_id': user_id}

Фастапи:

В Fastapi мы используем тип подсказки в Python, чтобы указать все типы данных. Например, здесь мы указываем, что user_id должно быть целым числом. Переменная в пути URL также указана аналогичная F-струна.

@app.get('/users/{user_id}')
def get_user_details(user_id: int):
    return {'user_id': user_id}

Строки запросов

Мы хотим позволить пользователю указать сеанс поиска, используя строку запроса ? Q = ABC в URL.

Колбу:

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 запрос

Давайте возьмем пример игрушки, где мы хотим отправить запрос на 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: Если вы просто повторите функциональность из колбы, вы можете сделать это следующим образом в 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 AS:

from pydantic import BaseModel

class Sentence(BaseModel):
    text: str

@app.post('/lowercase')
def lower_case(sentence: Sentence):
    return {'text': sentence.text.lower()}

Как видно, вместо того, чтобы получить словарь, данные JSON преобразуются в объект схемы Предложение Отказ Таким образом, мы можем получить доступ к данным с использованием атрибутов данных, таких как предложение. Text Отказ Это также обеспечивает автоматическую проверку типов данных. Если пользователь пытается отправлять любые данные, отличные от строки, им будет дана автоматическая сгенерированная ошибка проверки.

Пример Неверный запрос

{"text": null}

Автоматический ответ

{
    "detail": [
        {
            "loc": [
                "body",
                "text"
            ],
            "msg": "none is not an allowed value",
            "type": "type_error.none.not_allowed"
        }
    ]
}

Файл загружен

Давайте создадим API, чтобы вернуть загруженное имя файла. Ключ, используемый при загрузке файла, будет Файл Отказ

Колбу Флэк позволяет получить доступ к загруженному файлу через объект запроса.

# 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 использует параметр функции для указания ключа файла.

# app.py
from fastapi import FastAPI, UploadFile, File

app = FastAPI()

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

Представление формы

Мы хотим получить доступ к области текстового формы, которое определяется, как показано ниже, и echo значение.


Колбу Фладка позволяет допускать доступ к полям формы через объект запроса.

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

Фастапи: Мы используем функциональный параметр для определения ключа и типа данных для поля формы.

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

Печенье

Мы хотим получить доступ к файлю cookie Имя по запросу.

Колбу Колба позволяет допускать доступу к файлам cookie через объект запроса.

# app.py

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

@app.route('/profile')
def profile():
    name = request.cookies.get('name')
    return {'name': name}

Фастапи: Мы используем параметр, чтобы определить ключ для cookie.

# app.py
from fastapi import FastAPI, Cookie
app = FastAPI()

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

Модульные виды

Мы хотим разложить виды из одного приложения .py в отдельные файлы.

- app.py
- views
  - user.py

Колбу: В колбе мы используем концепцию под названием BluetPrints для управления этим. Сначала мы бы создадим план для представления пользователя как:

# 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 эквивалент чертежи называется маршрутизатором. Во-первых, мы создаем пользовательский маршрутизатор как:

# 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 не предоставляет никаких входных данных Vavelation Failet из коробки. Это обычная практика для записи пользовательской логики проверки или использует библиотеки, такие как Marshmalllow или Pydantic .

Фастапи:

Fastapi обертывает Pydantic в его рамках и позволит проверять данные, просто используя комбинацию подсказки Pydantancy Schema и 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}

Этот код будет выполнять автоматическую проверку, чтобы убедиться, что Имя это строка и возраст это целое число. Если любой другой тип данных отправляется, он автоматически генерирует ошибку проверки с соответствующим сообщением.

Вот несколько примеров пидантической схемы для общих случаев использования.

Пример 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

Вы можете узнать больше о подсказках типа Python от здесь Отказ

Автоматическая документация

Колбу Фладка не предоставляет никакой встроенной функции для генерации документации. Есть такие расширения, как колбу или Флэк-реститут заполнить этот разрыв Но рабочий процесс сравнительно сложен.

Фастапи: Fastapi автоматически генерирует интерактивную конечную точку документации 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 из коробки. Нам нужно использовать расширение, такие как Flask-Cors Чтобы настроить CORS, как показано ниже.

# app.py

from flask import Flask
from flask_cors import CORS

app_ = Flask(__name__)
CORS(app_)

Фастапи: Fastapi предоставляет Встроенная промежуточная программа обращаться с числами. Мы показываем пример 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 с лучшими практиками, запеченными. Вы можете обратиться к Документация Узнать больше.

Соединять

Если вам понравился этот блог, не стесняйтесь связаться со мной на Twitter Где я разделяю новые сообщения в блоге каждую неделю.

Оригинал: “https://dev.to/amitness/fastapi-for-flask-users-1bg4”