Template for a HTTP Web Backend using the following technologies:
- Python 3.11+
- Poetry to manage Python Virtual Environnement and dependencies.
- Docker to manage deployment in production and database in development.
- Postgresql as database choice.
- SQLAlchemy as ORM (Object Relational Mapper) library.
- Alembic to manage database migrations.
- Strawberry as GraphQL API Framework.
- FastAPI as Asynchronous Web Framework.
- Uvicorn as Asynchronous Web Server.
- Pytest as Test Framework.
- Sphinx to generate documentation from codebase.
To use this template, rename all mentions of "template" with the name of your project.
You first need to create 2 configuration files:
- Create ./docker/docker.env file with as structure similar to ./docker/docker.example.env
- Create ./src/settings.ini file with a structure similar to ./src/settings.example.ini
If you wish to use docker-postgresql in dev, start it using the .dev compose file:
cd docker
docker compose -f docker-compose.dev.yaml --env-file docker.env up
# Optional, make a backup of production database
sudo rsync -av --no-perms --delete --chown=$(whoami) ../template_postgres_data/ ~/template_postgres_save
sudo chown -R $(whoami):$(whoami) ../template_postgres_save
# And download it to use for your development tests
sudo rsync -avz --stats --delete $(whoami)@<server>:~/template_postgres_save/ ../template_postgres_data
sudo rm -rf ~/template_postgres_save
To run the code, using poetry:
# Make sure you have poetry
python -m pip install pipx
python -m pipx install poetry
# Install dependencies
poetry install --with docs,tests
# Generate documentation
cd docs
poetry run sphinx-build . _build
# Run tests
cd src
poetry run pytest
# Get information about the virtual environment (to setup in your ide)
poetry env info
# Run
cd src
poetry run python main.py
# If you want to remove your venv associated
poetry env remove python
To generate a new database migration, use alembic:
poetry run alembic revision --autogenerate
If everything is properly setup (configuration files), its only a git pull and restart:
cd docker
docker compose down
git pull
docker compose --env-file docker.env up --build -d