Метод __call__
Метод __call__ применяется к экземпляру класса
StaticFiles и превращает его в ASGI-приложение.
Именно благодаря этому методу объект StaticFiles
можно передать в app.mount в качестве обработчика.
Первым параметром метод принимает ASGI-словарь
scope с информацией о запросе, вторым - функцию
receive для получения тела запроса, третьим -
функцию send для отправки ответа клиенту.
Внутри метод определяет запрошенный путь, находит файл
в директории и отдаёт его с корректным MIME-типом.
Синтаксис
async def __call__(self, scope, receive, send)
Пример
Давайте создадим приложение и подключим раздачу статики
из директории static:
from fastapi import FastAPI
from fastapi.staticfiles import StaticFiles
app = FastAPI()
app.mount('/static', StaticFiles(directory='static'), name='static')
При запросе к адресу /static/logo.png FastAPI вызовет
метод __call__ у экземпляра StaticFiles,
который найдёт файл static/logo.png и отдаст его
клиенту с заголовком Content-Type: image/png.
Пример
Давайте вручную вызовем экземпляр StaticFiles
как ASGI-приложение и посмотрим, что метод принимает
три аргумента:
В этом примере объект static вызывается как функция
благодаря методу __call__. Параметр scope
описывает запрос, receive читает тело запроса,
а send отправляет ответ.
Пример
Давайте проверим, что метод __call__ действительно
делает экземпляр вызываемым:
Результат выполнения кода:
Смотрите также
-
класс
StaticFiles,
который раздаёт статические файлы -
атрибут
directory,
который задаёт директорию со статикой -
атрибут
html,
который включает режим HTML -
атрибут
check_dir,
который проверяет существование директории