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