Фреймворк 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