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

Pydantic for Fastapi

Fastapi – это современная асинхронная структура для Python. Согласно Python Developers Survey 2020, Fastapi … Tagged с Python, программированием.

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”