Программирование ARM FastAPI Fri, October 31 2025  

Поделиться

Нашли опечатку?

Пожалуйста, сообщите об этом - просто выделите ошибочное слово или фразу и нажмите Shift Enter.


FastAPI Печать
Добавил(а) microsin   

FastAPI это современный, быстрый фреймворк web для построения API на стандартных типах Python.

Ключевые фичи FastAPI:

● Fast: очень высокая производительность на основе NodeJS и Go. Один из самых быстрых доступных фреймворков Python.
● Скорость разработки повышается на 200% .. 300%(*).
● Меньше багов: уменьшение примерно на 40% человеческих ошибок разработчика(*).
● Интуитивно-понятен: отличная поддержка редактора, везде есть завершение операторов. Меньше тратится времени на отладку.
● Простота: разработано с акцентом легкости использования и обучения. Меньше тратится времени на чтение документации.
● Краткость: минимизируется дублирование кода. Несколько фич для декларации каждого параметра. Меньше ошибок.
● Надежность: получение готового к использованию кода. Автоматическая генерация интерактивной документации.
● Основно на стандартах: базируется на (с обеспечением полной совместимости) на открытых стандартах для API: OpenAPI (ранее известного как Swagger) и JSON Schema.

Примечание (*): оценка основана на внутренних тестах команды разработчиков, сборке рабочих приложений.

[Typer, FastAPI для CLI]

Если вы разрабатываете CLI-приложение в терминале вместо web API, рассмотрите Typer [2]. Typer - младший брат FastAPI. И это должен быть FastAPI интерфейса командной строки.

FastAPI стоит на плечах гигантов:

Starlette [3] для частей web.
Pydantic [4] для частей данных.

[Установка FastAPI]

Создайте и активируйте виртуальное окружение (например на основе pyenv), и затем установите FastAPI (убедитесь, что заключили "fastapi[standard]" в кавычки, чтобы это работало во всех терминалах):

$ pip install "fastapi[standard]"

[Простой пример приложения]

Сервер, обрабатывающий запросы GET. Создайте файл main.py:

from typing import Union
from fastapi import FastAPI
app = FastAPI()

@app.get("/")
def read_root(): return {"Hello": "World"}

@app.get("/items/{item_id}")
def read_item(item_id: int, q: Union[str, None] = None): return {"item_id": item_id, "q": q}

Если ваш код использует async/await, то примените async def:

from typing import Union
from fastapi import FastAPI
app = FastAPI()

@app.get("/")
async def read_root(): return {"Hello": "World"}

@app.get("/items/{item_id}")
async def read_item(item_id: int, q: Union[str, None] = None): return {"item_id": item_id, "q": q}

Примечание: если вы не понимаете, что такое async/await, то см. [5].

Запустите этот скрипт командой:

$ fastapi dev main.py

FastAPI fig01

Команда fastapi dev прочитает файл main.py, обнаружит в нем приложение FastAPI и запустит сервер, используя Uvicorn. По умолчанию fastapi dev запустится с разрешенной фичей auto-reload для локальной разработки. Подробнее об этом можно прочитать в документации FastAPI CLI [6].

Для проверки работы этого сервера откройте в браузере ссылку http://127.0.0.1:8000/items/5?q=somequery и вы увидите текстовое сообщение ответа в формате JSON:

{"item_id":5,"q":"somequery"}

FastAPI fig02

Этими простыми действиями вы создали следующий интерфейс с веб-сервером (API):

● Сервер принимает HTTP-запросы в пути / и /items/{item_id}.
● Оба этих пути принимают операции GET (также известные как методы HTTP).
● Путь /items/{item_id} имеет параметр item_id, который должен быть int.
● Путь /items/{item_id} имеет опциональный строковый параметр (тип str) запроса q.

Для созданного вами приложения веб-сервера main.py из коробки доступна документация. Вы можете открыть её по ссылкам в браузере:

http://127.0.0.1:8000/docs#/
http://127.0.0.1:8000/redoc

Апгрейд: добавление обработки запроса PUT. Давайте теперь изменим файл main.py, чтобы сервер принимал запрос PUT. Тело запроса декларируется с помощью стандартных типов Python, благодаря классу Pydantic.

from typing import Union
from fastapi import FastAPI
from pydantic import BaseModel
app = FastAPI()
class Item(BaseModel): name: str price: float is_offer: Union[bool, None] = None

@app.get("/")
def read_root(): return {"Hello": "World"}

@app.get("/items/{item_id}")
def read_item(item_id: int, q: Union[str, None] = None): return {"item_id": item_id, "q": q}

@app.put("/items/{item_id}")
def update_item(item_id: int, item: Item): return {"item_name": item.name, "item_id": item_id}

Проверим работу запроса PUT с помощью сервиса интерактивной документации, по ссылке http://127.0.0.1:8000/docs#/:

FastAPI fig03

Разверните выпадающий список PUT, нажмите на кнопку "Try it out", это позволит заполнить поля запроса item_id и отредактировать текст тела запроса "Request body".

FastAPI fig04

После этого нажмите на кнопку Execute. В логе сервера вы увидите сообщения "PUT /items/1234 HTTP/1.1" 200:

INFO Will watch for changes in these directories: ['/home/appFastAPI']
INFO Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit)
INFO Started reloader process [57266] using WatchFiles
INFO Started server process [57320]
INFO Waiting for application startup.
INFO Application startup complete.
INFO 127.0.0.1:48966 - "GET /docs HTTP/1.1" 200
INFO 127.0.0.1:48966 - "GET /openapi.json HTTP/1.1" 200
INFO 127.0.0.1:54810 - "PUT /items/1234 HTTP/1.1" 200
INFO 127.0.0.1:43518 - "PUT /items/1234 HTTP/1.1" 200
INFO 127.0.0.1:43518 - "PUT /items/1234 HTTP/1.1" 200

Резюме. В общем, вы декларируете однократно типы параметров, тело и прочее как параметры функции. Это делается с помощью стандартных современных типов Python. Вам не нужно изучать новый синтаксис, методы или классы конкретной библиотеки и т. д. Это просто стандартный Python.

Например, для типа int:

item_id: int

Или для более сложной модели Item:

item: Item

... и с такой одиночной декларацией вы получите:

1. Поддержку редактора, включая:
   ● Completion (автозавершение операторов).
   ● Проверку типов.

2. Проверку допустимости данных:
   ● Автоматические и понятные ошибки, когда данные недопустимые.
   ● Проверка срабатывает даже для глубоко вложенных объектов JSON.

3. Преобразование входных данных: данные, поступающие по сети, преобразуются в данные и типы Python. Поддерживается чтение из:
   ● JSON.
   ● Параметров пути (Path).
   ● Параметров запроса (Query).
   ● Cookies.
   ● Headers.
   ● Forms.
   ● Files.

4. Преобразование выходных данных: из данных и типов Python в сетевые данные (в виде JSON):
   ● Преобразование типов Python (str, int, float, bool, list, etc).
   ● Объекты datetime.
   ● Объекты UUID.
   ● Модели базы данных.
   ● ... и многое другое.

5. Автоматическая интерактивная документация для вашего созданного API, включая 2 альтернативных пользовательских интерфейса:
   ● Swagger UI.
   ● ReDoc.

Если вернуться к последнему примеру кода, то FastAPI будет делать следующее:

1. Проверит наличие item_id в пути для запросов GET и PUT.

2. Проверит, что у item_id тип int для запросов GET и PUT.

  - Если это не так, то клиент увидит понятное сообщение об ошибке.

3. Проверит наличие опционального параметра запроса с именем q (как в http://127.0.0.1:8000/items/foo?q=somequery) для запросов GET.

  - Поскольку параметр q декларирован с = None, то он опциональный (его наличие необязательно).
  - Без None он становится требуемым (поскольку это тело запроса в случае PUT).

4. Для запросов PUT /items/{item_id} тело считывается как JSON:

  - Проверяется, что требуемый атрибут name имеет тип str.
  - Проверяется, что требуемый атрибут price имеет тип float.
  - Проверяется, есть ли опциональный атрибут is_offer, который, если он присутствует, должен иметь тип bool.
  - Все это будет также работать и для вложенных объектов JSON.

5. Автоматическое преобразование в JSON и обратно.

6. Все документируется с OpenAPI, что может использоваться:

  - Интерактивными системами документации.
  - Автоматическими системами генерации кода клиента для многих языков.

7. Напрямую предоставляются 2 вида интерактивной web-документации.

На сайте https://fastapi.tiangolo.com/ вы можете также ознакомиться с руководствами:

1. Декларация параметров из других различных мест: headers, cookies, form fields и files.

2. Устанавливать ограничения для проверки параметров, такие как maximum_length или regex.

3. Очень мощная и простая в использовании система инжекции зависимостей (Dependency Injection).

4. Безопасность и аутентификация, включая поддержку для OAuth2 с токенами JWT и базовой аутентификацией HTTP (HTTP Basic auth).

5. Более продвинутые (но все еще несложные) техники для декларации глубоко вложенных моделей JSON (благодаря Pydantic).

6. Интеграция GraphQL со Strawberry и другими библиотеками.

7. Множество дополнительного функционала (благодаря Starlette):

  - WebSockets
  - Простые тесты на основен HTTPX и pytest
  - CORS
  - Cookie Sessions
  ... и многое другое.

[Ссылки]

1. FastAPI Source Code.
2. Typer.
3. starlette.
4. Pydantic Validation.
5. Concurrency and async / await.
6. FastAPI CLI.

 

Добавить комментарий


Защитный код
Обновить

Top of Page