Directory tree for serving multiple packages as Flask API with multiple endpoints
.
├── app
│ ├── api_a
│ │ ├── __init__.py
│ │ ├── main.py
│ │ ├── sub.py
│ │ └── views.py
│ ├── api_b
│ │ ├── __init__.py
│ │ ├── main.py
│ │ ├── sub.py
│ │ └── views.py
│ ├── flask_run.py
│ ├── __init__.py
│ ├── settings.py
│ └── tests
│ ├── __init__.py
│ └── test_api.py
├── .env
├── .gitignore
├── docker-compose.yml
├── Dockerfile
├── pyproject.toml
├── requirements-dev.txt
├── requirements.in
└── requirements.txt
4 directories, 21 files
-
Install docker and docker-compose on your machine.
-
Clone the repository &
cd
to the root directory.
Run the docker container:
docker-compose up
The app will run locally in port 4000
.
While the above container is running, the API can be accessed via any API development client like Postman.
Run the following command to test the api with curl. Make sure you're sending X-Api-Key: 1234ABCD
with the header:
curl -H "Accept: application/json" -H "Content-Type: application/json" -H "X-Api-Key: 1234ABCD" http://localhost:4000/api-a/123
It should return a response similar to this:
{
"random_first":16,
"random_second":73,
"seed":123
}
Httpx is a modern and faster alternative to Python's revered requests library with similar public API.
-
Install
httpx
in your local environment:pip install httpx
-
Run:
import httpx headers = { "Accept": "application/json", "Content-Type": "application/json", "X-Api-Key": "1234ABCD", } with httpx.Client() as client: response = client.get("http://localhost:4000/api-a/123", headers=headers) json_data = response.json() # Check successful status code. assert response.status_code == 200 # Print JSON response. print(json_data)
Run:
pytest
If you run the tests while the Docker container is running, pytest will run all the tests. However, pytest will only run the unit tests if you run them offline.
Run:
docker-compose down
This template is developed and tested on
- Python 3.8
- Docker version 19.03.13
- docker-compose 1.26.2
- Ubuntu 20.04 LTS