Сервер для розробки¶
FastAPI не запускає сам себе. Застосунок FastAPI — це ASGI-застосунок (об'єкт), і щось має насправді відкрити сокет, говорити HTTP і передавати запити до нього. Це «щось» — ASGI-сервер, майже завжди Uvicorn. Цей розділ про те, як запускати ваш застосунок під час розробки.
fastapi dev — спосіб «з батарейками»¶
Якщо ви встановили fastapi[standard], у вас є CLI fastapi. fastapi
dev — це команда для розробки:
Вона знаходить екземпляр FastAPI у main.py, запускає Uvicorn з
увімкненим автоперезавантаженням, прив'язується до 127.0.0.1:8000 і
друкує, де застосунок та інтерактивна документація:
Відредагуйте файл, збережіть — і сервер перезапуститься автоматично.
uvicorn — команда під капотом¶
fastapi dev — це зручна обгортка. Під нею — просто Uvicorn, і ви можете
викликати Uvicorn напряму; саме це більшість проєктів кладуть у свої
скрипти:
main:app — це module:variable, тобто об'єкт app у main.py. Корисні
прапорці:
uvicorn main:app --reload # dev: auto-reload on
uvicorn main:app --host 0.0.0.0 --port 9000 # bind all interfaces, port 9000
uvicorn main:app --reload --reload-dir app # only watch ./app for changes
uvicorn main:app --log-level debug # noisier logs
Значення за замовчуванням, які варто знати: host 127.0.0.1, port 8000,
reload вимкнено (тому --reload тут вказано явно, тоді як fastapi
dev вмикає його за вас).
З досвіду Django:
uvicorn main:app --reload— прямий відповідникpython manage.py runserver: локальний HTTP-сервер зі спостерігачем за файлами, що перезапускається при збереженні.manage.py runserverтеж за замовчуванням слухає127.0.0.1:8000і приймає адресу так, як ви й очікуєте:runserver 0.0.0.0:9000. Автоперезавантаження там теж увімкнено за замовчуванням;--noreloadвимикає його (відповідник чистогоuvicornбез--reload).
Запуск «по-справжньому»: fastapi run і воркери¶
Ось частина, яка дивує Django-розробників. manage.py runserver — це
сервер тільки для розробки; документація Django жирним шрифтом
застерігає ніколи не використовувати його в продакшені. З Uvicorn інакше:
він і є продакшн-ASGI-сервером. Команди для розробки та для продакшену —
це просто різні профілі однієї програми.
fastapi run main.py # prod profile: no reload, binds 0.0.0.0
fastapi run main.py --workers 4 # 4 worker processes
# the Uvicorn equivalent:
uvicorn main:app --host 0.0.0.0 --port 8000 --workers 4
--workers N запускає N незалежних робочих процесів, щоб задіяти кілька
ядер CPU. (Автоперезавантаження та кілька воркерів не поєднуються — reload
працює в одному процесі.)
З досвіду Django: У світі Django сервер для розробки та продакшн-сервер — це дві різні програми: ви розробляєте з
runserver, а розгортаєте за Gunicorn чи uWSGI (WSGI) або Uvicorn/Daphne (ASGI). З FastAPI немає одноразового dev-сервера, який лишається позаду — ви запускаєте Uvicorn в обох місцях, вимикаючи--reloadі піднімаючи--workersдля продакшену. Масштабування на кілька процесів, яке Django віддає Gunicorn (gunicorn --workers 4), тут — цеuvicorn --workers 4. Розгортання отримає окремий розділ згодом; зараз ідея в тому, що сервер — той самий.
Кілька слів про перезавантажувач¶
Автоперезавантажувач стежить за вашими вихідними файлами й перезапускає
процес сервера при зміні. Це розробницька можливість в обох
фреймворках — вимикайте її в продакшені (вона додає накладні витрати й
потік спостереження за файлами). fastapi run і uvicorn --workers уже
залишають її вимкненою; з runserver ви б передали --noreload.
Одне, що runserver робить, а Uvicorn — ні: автоматично роздає ваші
статичні файли в режимі DEBUG. FastAPI не має обробки статичних файлів,
доки ви її не додасте — це розглянуто в розділі Шаблони та статичні
файли.
Супровідні проєкти¶
Мінімальний застосунок, побудований обома способами, у каталозі
03-demo/ цього розділу:
03-demo/fastapi/(завантажити) — запуск черезfastapi dev main.py; тестування черезpytest.03-demo/django/(завантажити) — запуск черезpython manage.py runserver; тестування черезpython manage.py test.
Щоб вони були чесними щодо обслуговування запитів, кожен набір тестів
містить один тест, який піднімає справжній сервер по HTTP — Uvicorn у
підпроцесі на боці FastAPI, manage.py runserver у підпроцесі на боці
Django — і робить реальний HTTP-запит, а не лише використовує вбудований
тестовий клієнт.