Фреймворк starlette.
Basics of Python and 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