Фреймворк starlette.

Основы Python и Django. -> Фреймворк starlette.

Фреймворк starlette.

Установка

pip install starlette uvicorn

Создаем простое приложение start.py

from starlette.applications import Starlette
from starlette.responses import JSONResponse
from starlette.routing import Route


async def homepage(request):
    return JSONResponse({'hello': 'world'})


app = Starlette(debug=True, routes=[
    Route('/', homepage),
])

Route(url, func) - привязка url к функции.

Т.к. мы используем протокол ASGI, то функцию определяем как async (асинхнонную).

Запускаем через обработчик ASGI протокола uvicorn

uvicorn start:app

Контейнеризация

Создаем докер контейнер.

Создаем точку входа для контейнера entrypoint.sh.

#!/bin/sh
uvicorn start:app
exec "$@"

Создаем сборщик контейнеров docker-compose.yaml

version: "3"
services:
    starlette:
        build:
            context: .
            dockerfile: docker/Dockerfile.python
        ports:
            - 8180:8180
        depends_on:
            - db
        volumes:
            - ./app:/app
        container_name: starlette-server
        networks:
            - starlette-network

    db:
        image: postgres:13.1-alpine
        container_name: starlette-db
        environment:
            POSTGRES_USER: miya_db
            POSTGRES_PASSWORD: 1q2w3e
            POSTGRES_DB: db
        ports:
            - 5432:5432
        volumes:
            - ./storage/postgresql:/var/lib/postgresql/data
        networks:
            - starlette-network

networks:
    starlette-network:
        driver: bridge

Тут у нас 2 контейнера под базу данных и под сервер starlette на одной мостовой сети.

Данные храним в локальной папке storage.

Поэтому для удобства перезапуска создадим bash скрипт ./bin/rb

#!/bin/sh
sudo rm -r storage
docker-compose down
docker-compose up --build

Положим sql дамп в папку initdb/dump.sql

Далее уберем #POSTGRES_DB: db и пробросим папку initdb внутрь контейнера.

    ...
    environment:
        ...
        #POSTGRES_DB: db
    ...
    volumes:
        ...
        - ./initdb:/docker-entrypoint-initdb.d
    ...

Создадим скрипт для удаления, пересобирания и запуска контейнеров в bin/rb

#!/bin/sh
sudo rm -r storage
docker-compose down
docker-compose up --build

Полный вариант doker-compose.yaml

version: "3"
services:
    starlette:
        build:
            context: .
            dockerfile: docker/Dockerfile.python
        ports:
            - 8180:8180
        depends_on:
            - db
        volumes:
            - ./app:/app
        container_name: starlette-server
        networks:
            - starlette-network

    db:
        image: postgres:13.1-alpine
        container_name: starlette-db
        environment:
            POSTGRES_USER: miya_db
            POSTGRES_PASSWORD: 1q2w3e
            #POSTGRES_DB: db
        ports:
            - 5432:5432
        volumes:
            - ./storage/postgresql:/var/lib/postgresql/data
            - ./initdb:/docker-entrypoint-initdb.d
        networks:
            - starlette-network

networks:
    starlette-network:
        driver: bridge