FASTAPI это современная асинхронная структура для Python. Согласно Python Developers Survey 2020 , Fastapi – третья самая популярная веб -структура для Python.
Что делает Fastapi таким популярным?
- Асинхро
- Быстро
- Легко кодировать и быстрая обучающая кривая.
- Проверка данных через Pydantic
- Автоматические документы
Взгляните на все Функции FASTAPI Анкет
Pydantic это библиотека Python для анализа и проверки данных с использованием Подсказки типа Python Анкет Это Самая быстрая библиотека проверки данных Python Анкет
Pydantic for Fastapi
1. Основания для чтения переменных среды
Это требует Python-Dotenv
установлены.
pip install python-dotenv
Манекен .env
файл:
DB_NAME=postgres DB_PASS=postgres DB_URL=postgresql://postgres:postgres@127.0.0.1:5432/postgres DEBUG=True SEED=42
# env.py from pydantic import BaseSettings, PostgresDsn class Settings(BaseSettings): db_name: str db_pass: str db_url: PostgresDsn debug: bool seed: int class Config: env_file = ".env" env_file_encoding = "utf-8" settings = Settings() print(settings)
Выход:
db_name='postgres' db_pass='postgres' db_url=PostgresDsn('postgresql://postgres:postgres@127.0.0.1:5432/postgres', scheme='postgresql', user='postgres', password='postgres', host='127.0.0.1', host_type='ipv4', port='5432', path='/postgres') debug=True seed=42
- Переменные среды автоматически загружаются по имени.
- Они преобразуются в типы, указанные по типам.
По умолчанию все переменные нечувствительны к случаям.
Вы также можете использовать псевдоним для загрузки значений ENV. Например, ваша переменная env – Database_url
, Но вам нужно загрузить его как DB_URL
Анкет
from pydantic import BaseSettings, Field, PostgresDsn class Settings(BaseSettings): db_url: PostgresDsn = Field(..., env="DATABASE_URL")
Чтение env
Файл требуется только в том случае, если значения не находятся в системной среде. Этот процесс является дорогостоящим, особенно при чтении для каждого запроса. Так что кэшируйте значения, используя lru_cache
Анкет
from functools import lru_cache # other imports class Settings(BaseSettings): # All fields, yadayadayada class Config: env_file = ".env" env_file_encoding = "utf-8" @lru_cache def get_settings() -> Settings: return Settings() settings = get_settings()
Каждый раз, когда get_settings
называется, кэшированные значения возвращаются.
2. Валидаторы для пользовательской проверки данных
Валидаторы применяются к BaseModel Чтобы выполнить пользовательскую проверку.
Базовый BaseModel + Fastapi
Применение:
from fastapi import FastAPI from pydantic import BaseModel app = FastAPI() class User(BaseModel): email: str # use EmailStr from pydantic username: str password: str @app.post("/") async def register(user: User): return user
Проверьте это, используя httpie :
➜ http POST 127.0.0.1:8000 email=test@test.com username=amal password=amal HTTP/1.1 200 OK content-length: 61 content-type: application/json date: Wed, 19 May 2021 12:20:06 GMT server: uvicorn { "email": "test@test.com", "password": "amal", "username": "amal" }
Давайте использовать @Validator
От Pydantic, чтобы выполнить некоторую операцию на BaseModel перед видом, регистр
, получает это.
from pydantic import BaseModel, validator class User(BaseModel): email: str # use EmailStr from pydantic username: str password: str @validator("password") def hash_the_password(cls, password: str): return f"Fast-Insecure-Hash-{password}"
➜ http POST 127.0.0.1:8000 email=test@test.com username=amal password=amal HTTP/1.1 200 OK content-length: 80 content-type: application/json date: Wed, 19 May 2021 12:39:06 GMT server: uvicorn { "email": "test@test.com", "password": "Fast-Insecure-Hash-amal", "username": "amal" }
Вы также можете проверить конкретное поле с остальными полями.
@validator("password") def hash_the_password(cls, password, values, **kwargs): print(values.keys()) return password
Это отпечатки dict_keys (['email', 'username'])
в stdout. Пиданские поля подтверждены последовательно, а ценности
Дикт несет уже подтвержденные поля.
В этом случае, поскольку мы подтверждаем пароль
Поле, все вышеупомянутые поля доступны для использования.
Вы можете использовать Валидатор корня использовать данные всей модели. По умолчанию root Validator получает данные после того, как все поля подтверждены (то есть проверка по умолчанию).
@root_validator def test_root_validator(cls, values): print(values.keys()) return values
Выход:
dict_keys(['email', 'username', 'password'])
3. schema_extra для предоставления примеров в документах
С предыдущим примером, если вы перемещаетесь в http://127.0.0.1:8000/docs , вы можете увидеть Интерактивные документы от FASTAPI.
Вместо строка
Для всех значений давайте напишем несколько пользовательских данных для примеров.
class User(BaseModel): email: str # use EmailStr from pydantic username: str password: str class Config: schema_extra = { "example": { "email": "test@test.com", "username": "amal", "password": "amal", } }
Вы также можете использовать фальшивые библиотеки данных, такие как Faker генерировать случайные данные.
Установка примера данных также можно достичь так:
class User(BaseModel): email: str = Field(..., example="test@test.com") username: str = Field(..., example="amal") password: str = Field(..., example="amal")
Вывод
Pydantic – это удивительный инструмент для проверки данных. Fastapi использует Pydantic, чтобы помочь построить лучшие API. Для более удивительных черт Pydantic, прочитайте Официальная документация Анкет
Оригинал: “https://dev.to/amal/pydantic-for-fastapi-2385”