The only dependency required to use this template is poetry. The recommended method to install it is through pip.
$ pip3 install poetry
$ poetry config virtualenvs.in-project true
Remember to commit to the repo the poetry.lock
file generated by poetry install
.
The virtual environment is automatically created and activated via poetry.
$ cd to-project-path
$ poetry install
To make sure everything is set up correctly, run the following command which must show the virtual environment path:
$ poetry show -v
If still having problems, you can run source
command to enable the virtual environment from the shell:
$ poetry show -v
Using virtualenv: /home/<User>/<path>/taller2/fastapi-template/.venv
$ source .venv/bin/activate
Check the full poetry docs, but here goes a quick reminder,
poetry add <dependency> [--dev]
This template follows PEP8.
For this purpose, we use:
- black: an opinionated code formatting tool
- flake8: a tool to enforce style guide
- pylint: a source code, bug and quality checker
Linters
flake8 && pylint <module_name>
Formatter
black .
- Development:
uvicorn src.main:app --reload
- Production:
uvicorn src.main:app
You need docker-compose and docker to run the following containers and commands.
$ sudo ./scripts/test-container.sh
You have two options here, one is simple running:
$ sudo ./scripts/coverage-container.sh
which will execute all the tests and will exit the container afterwards.
Alternately, you can also run a container which will run the app and will provide the database. In one terminal run:
$ sudo ./scripts/test-container.sh
Then in other terminal run docker ps
and copy the container ID
from the docker_fastapi-server
image:
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
b1e9c7c4e040 docker_fastapi-server "./docker-entrypoint…" About a minute ago Up About a minute 0.0.0.0:8082->8082/tcp, :::8082->8082/tcp docker_fastapi-server_1
620c0b75ce2a mongo "docker-entrypoint.s…" About a minute ago Up About a minute 0.0.0.0:5438->5432/tcp, :::5438->5432/tcp docker_postgres_1
Finally, enter the container with docker exec -it [container-id] bash
and run the tests within the container using poetry run pytest
:
$ docker exec -it [container-id] bash
$ root@b1e9c7c4e040:/code# ls
docker-entrypoint.sh poetry.lock pyproject.toml src tests scripts
$ root@b1e9c7c4e040:/code# poetry run pytest
Documentation will be automatically generated at {app}/docs
We use the pytest framework to test. The easiest way to run tests is pytest
.
Remember to create functions with a name that starts with test_
(this is standard pytest conventions).
A few pipelines have been set to run on github actions to ensure code quality and deployment.
- Run Linter
- Run Tests
- Upload Test Coverage
- Deploy to Heroku using docker image
The pipeline automatically generates a coverage report and uploads it to codecov
You'll need to set the following actions secrets:
CODECOV_TOKEN
: Repo Token. Can be obtained on codecov when setting up or on settings
You'll need to set the following actions secrets:
HEROKU_APP_NAME
: App nameHEROKU_EMAIL
: Account emailHEROKU_API_KEY
: Account API key
This server uses MongoDB as its database.
Set MONGO_URL
as an environment variable and action secret to connect to the database.
To access the database and storage, you'll need to generate a Firebase private key.
To do so, go to Project configuration > Service accounts > Generate new private key. [Link]
Save the file as google-credentials.json
in the root directory of the repository.
You can also set TESTING=1
as an environment variable to use mocks of the database
and storage for testing purposes.
In order to load the credentials in Heroku, set GOOGLE_CREDENTIALS
as an environment variable in Heroku, and paste the content of the google-credentials.json
file.
The heroku Dockerfile includes the DataDog agent. Create a new DataDog API Key from here. Also, you need to set the following config vars in Heroku (you can use Heroku CLI if you want):
DD_API_KEY=<api_key_from_datadog>
DD_DYNO_HOST=false
HEROKU_APP_NAME=<app_name>
DD_TAGS=service:<meaningful_tag_for_datadog>