This template streamlines your FastAPI development, providing a robust foundation built on best practices.
Contributions are welcome!
- Modern Structure: Organized project layout for easy navigation and scaling.
- Essential Dependencies: Includes FastAPI, Uvicorn, Pytest (for testing), and Pydantic (for data validation).
- Environment Management: Preconfigured with Poetry for virtual environments and dependency management.
- API Routing: Sample
/healthendpoint included. - Testing Framework: Pytest for writing and running automated tests.
- Linting: Pre-commit hooks with Black for consistent code formatting.
- Logging: Structured logging with Loguru for better debugging and monitoring.
See here an example for project instantiation.
Ensure you have the following tools installed:
- Python: Recommended to use Pyenv for managing multiple Python versions.
- Pyenv: For managing multiple Python versions.
- Cookiecutter:
pip install cookiecutter - Poetry:
pip install poetry - (Optional) Cruft: For managing Cookiecutter templates more efficiently (not strictly required).
$ cookiecutter git@github.com:dktunited/dps-ml-databricks-template
[1/5] project_long_name (My Project): API Example
[2/5] project_name_dashes (my-project): api-example
[3/5] project_name_underscores (my_project): api_example
[4/5] version (0.1.0):
[5/5] description (My project description):
$ cd api-example
$ poetry install
[...]
Package operations: 44 installs, 0 updates, 0 removals
[...]
$ poetry run api-example
[\2024-05-28 15:58:59,332] {\root} \INFO - \[API] Starting service with version 0.1.0...
[\2024-05-28 15:58:59,332] {\root} \INFO - \[API] Log level set to DEBUG
[\2024-05-28 15:58:59,332] {\api_example.cli} \INFO - \[API] Log level set to DEBUG
[\2024-05-28 15:58:59,332] {\api_example.cli} \INFO - \[API] API service starting on 0.0.0.0:80
[\2024-05-28 15:59:15,529] {\uvicorn.error} \INFO - \Started server process [98569]
[\2024-05-28 15:59:15,529] {\uvicorn.error} \INFO - \Waiting for application startup.
[\2024-05-28 15:59:15,529] {\uvicorn.error} \INFO - \Application startup complete.
[\2024-05-28 15:59:15,534] {\uvicorn.error} \INFO - \Uvicorn running on http://0.0.0.0:80 (Press CTRL+C to quit)$ cruft create https://github.com/ai-helpers/api-cookiecutter-template
[1/5] project_long_name (My Project): API Example
[2/5] project_name_dashes (my-project): api-example
[3/5] project_name_underscores (my_project): api_example
[4/5] version (0.1.0):
[5/5] description (My project description):
$ cd api-example
$ poetry install
[...]
Package operations: 44 installs, 0 updates, 0 removals
[...]
$ poetry run api-example
[\2024-05-28 15:58:59,332] {\root} \INFO - \[API] Starting service with version 0.1.0...
[\2024-05-28 15:58:59,332] {\root} \INFO - \[API] Log level set to DEBUG
[\2024-05-28 15:58:59,332] {\api_example.cli} \INFO - \[API] Log level set to DEBUG
[\2024-05-28 15:58:59,332] {\api_example.cli} \INFO - \[API] API service starting on 0.0.0.0:80
[\2024-05-28 15:59:15,529] {\uvicorn.error} \INFO - \Started server process [98569]
[\2024-05-28 15:59:15,529] {\uvicorn.error} \INFO - \Waiting for application startup.
[\2024-05-28 15:59:15,529] {\uvicorn.error} \INFO - \Application startup complete.
[\2024-05-28 15:59:15,534] {\uvicorn.error} \INFO - \Uvicorn running on http://0.0.0.0:80 (Press CTRL+C to quit)$ cruft update
Respond with "s" to intentionally skip the update while marking your project as up-to-date or respond with "v" to view the changes that will be applied.
Apply diff and update? (y, n, s, v) [y]: y
Good work! Project's cruft has been updated and is as clean as possible!A simple endpoint to check the health of the application.
GET /healthReturns a status message indicating the service is up and running.
Provides information about the application.
GET /infoReturns metadata such as version, author, and other relevant details (cf. data/info.txt)
Endpoint for making predictions based on input data.
POST /predictAccepts a JSON payload with the necessary input data and returns the prediction results.
Endpoint for testing purposes.
GET /testReturns a test response, useful for debugging and ensuring the endpoint is reachable.
FastAPI provides interactive API documentation.
GET /docsAccess the Swagger UI for a user-friendly interface to interact with your API.
GET /redocAccess the ReDoc interface for an alternative documentation style.
To run the tests, you need to install the testing dependencies and then execute the test suite. Here are the commands to get started:
python -m pip install -U pip
python -m pip install -U pytest pytest-cookies
pytest pytest --keep-baked-projects test_cookiecutter.pyThese commands will ensure that your pip is up to date, install pytest and pytest-cookies for testing, and then run the tests defined in test_cookiecutter.py. The --keep-baked-projects flag keeps the generated projects for inspection even after tests are run.
Implementation of these tests in GitHub Actions is straightforward. You can see an example configuration in the .github/workflows/main.yml file. This setup ensures that tests are run automatically on each push or pull request, providing continuous integration and ensuring code quality.
├── .github
├── {{cookiecutter.project_name_dashes}}
│ ├── .github <- Github Actions CICD
│ ├── data
│ ├── docs <- Sphinx documentation
│ ├── src
│ └── {{cookiecutter.project_name_underscores}} <- Core of project
│ │ ├── endpoints <- API endpoints definition
│ │ ├── settings <- settings
│ │ ├── __init__.py
│ │ ├── app.py
│ │ ├── cli.py
│ │ ├── errors
│ │ ├── load_model.py
│ │ └── setup_logging.py
│ ├── tasks <- Makefile tasks
│ ├── tests <- tests (units tests, data tests)
│ ├── .gitignore
│ ├── .mypy.ini
│ ├── Makefile
│ ├── poetry.toml
│ ├── pyproject.toml
│ ├── README.md
├── .gitignore
├── .python-version
├── CONTRIBUTING.md
├── cookiecutter.json
├── README.md
├── test_cookiecutter.py
└── VERSION
Your contributions are valued! Please feel free to open issues or submit pull requests.
Let me know if you'd like any other sections added!
