Skip to content

Приступаем

После установки зависимостей давайте приступим к созданию первого приложения! Многие вещи вам уже знакомы из опыта с FastAPI

Полный пример

Пример содержит отправку писем по SMTP, кэширование, добавление новых команд, tortoise-orm, lifespans example

Создание проекта

Для начала создайте проект командой:

tower g p example

После выполнения команды, вы можете обнаружить Django-like структуру проекта и сразу же запустить сервер!

python manage.py run
tower run

Note

Перед испольвазнием tower для запуска сервера, работы с бд и т.д. Убедитесь что установлена переменная окружения FASTTOWER_SETTINGS_MODULE

uvicorn example.asgi:app 
hypercorn example.asgi:app 

Вот и все, вы построили первое работающее веб приложение! Но давайте разберемся что из себя представляет сгенерированный проект и напишем новый функционал помимо работающего Swagger-a из коробки.

Структура

После создания проекта командой:

tower g p example

Вы должны увидеть следующею структуру:

├── example/
│   ├── __init__.py
│   ├── asgi.py
│   ├── routers.py
│   └── settings.py
└── manage.py

Далее мы выясним, что в них находится!

manage.py

Служит для установки переменной FASTTOWER_SETTINGS_MODULE задающей путь до файла settings.py после чего запускает cli. Вы можете установить данную переменную в окружение и забыть о python manage.py вызывая cli tower командой

python manage.py --help
tower --help
manage.py
#!/usr/bin/env python
"""FastTower's command-line utility for administrative tasks."""
import os


def main():
    """Run administrative tasks."""
    os.environ.setdefault("FASTTOWER_SETTINGS_MODULE", "example.settings")
    try:
        from fasttower.cli import app
        app()
    except ImportError as exc:
        raise ImportError(
            "Couldn't import FastTower. Are you sure it's installed and "
            "available on your PYTHONPATH environment variable? Did you "
            "forget to activate a virtual environment?"
        ) from exc


if __name__ == '__main__':
    main()

settings.py

В нем можно добавлять новые middleware - которые автоматически привяжутся к экземпляру FastTower, регистрировать app, так же задавать часовой пояс, secret key, debug режим и прочее.

settings.py
from pathlib import Path

BASE_DIR = Path(__file__).resolve().parent.parent

# SECURITY WARNING: keep the secret key used in production secret!
SECRET_KEY = "l6q4CY6UhJXppm8TjiyhUF2nhEGaX1aPao3RnkyRavY"

# SECURITY WARNING: don't run with debug turned on in production!
DEBUG = True

ALLOWED_HOSTS = ["*"]

INSTALLED_APPS = [
    'fasttower.apps.taerich',
    'fasttower.auth',
]

MIDDLEWARE = [
    ["fastapi.middleware.trustedhost.TrustedHostMiddleware", {"allowed_hosts": ALLOWED_HOSTS}],
    ["fastapi.middleware.gzip.GZipMiddleware", {"minimum_size": 1000, "compresslevel": 5}],
]
if DEBUG:
    MIDDLEWARE += ["debug_toolbar.middleware.DebugToolbarMiddleware"],

USER_MODEL = 'fasttower.auth.models.BaseUser'

ASGI = "example.asgi:app"

LANGUAGE_CODE = "en-us"
TIME_ZONE = "UTC"
USE_TZ = True

# Database
DATABASES = {
    "connections": {
        "default": {
            "engine": "tortoise.backends.sqlite",
            "credentials": {
                "file_path": str(BASE_DIR / "db.sqlite3"),
            }
        },
    },
}

CACHE = {
    "default": {
        "BACKEND": "fasttower.cache.InMemoryBackend",
    }
}

#https://github.com/fastapi-admin/fastapi-admin
ADMIN_PANEL_REDIS = 'redis://localhost:6379/0'

asgi.py

FastTower унаследован от FastAPI и выполняет роль для установки middleware, debug режима. Вы можете переназначить значения, которые выставляются из settings.py:

app = FastTower(debug=True, title="FastTower API Documentation",
                lifespan=lifespans([tortoise_lifespan, cache_lifespan]))

В этом примере даже если в settings установлен DEBUG=False, окончательно будет установлен True

Если вы не используете tortoise или cache - уберите их из lifespans

app = FastTower(title="FastTower API Documentation", lifespan=lifespans([]))
asgi.py
"""
ASGI config for example project.

It exposes the ASGI callable as a module-level variable named ``app``.
"""

import os

from fasttower.utils import setup

os.environ.setdefault("FASTTOWER_SETTINGS_MODULE", "example.settings")
setup()

from fasttower.server import FastTower

from fasttower.utils import lifespans
from fasttower.cache.lifespan import cache_lifespan
from fasttower.db.lifespan import tortoise_lifespan

from example.routers import router

app = FastTower(title="FastTower API Documentation", lifespan=lifespans([tortoise_lifespan, cache_lifespan]))

app.include_router(router)

routers.py

О APIRouter

routers.py
from fasttower.routers import APIRouter

from appexample.routers import router as appexample_router

router = APIRouter(prefix="/api/v1")
router.include_router(appexample_router)