Rest API template developed in Python with the Flask framework. The template covers user management, jwt tokens for authentication, and assign permissions for each user with Flask Principal. In the local environment, it uses docker to create an environment made up of several services such as api (flask), database (postgresql), reverse-proxy (nginx).
- Technology
- Requirements
- Environments
- Flask Commands
- Database commands
- Swagger
- Reference
- Contribution
- Operating System: Ubuntu 20.04
- Web Framework: Flask
- ORM: Flask-sqlalchemy
- Swagger: Swagger-UI
- Authentication: Flask Json Web Token
- Permission: Flask Principal
- Serialization, Deserialization and Validation: Marshmallow
- Migration Database: Flask-migrate
- Environment manager: Anaconda/Miniconda
- Containerization: Docker, docker-compose
- Database: PostgreSQL
- Python WSGI HTTP Server: Gunicorn
- Proxy: Nginx
- Tests: Unittest
- Deployment platform: AWS
- CI/CD: Github Actions
Development environment that uses PostgreSQL in local and uses the server flask in debug mode.
-
Create environment and install packages:
conda create -n backend python=3.9
conda activate backend
pip install -r requirements.txt
-
Create PostgreSQL on Ubuntu 20.04 Install PostgresSQL
sudo apt-get install postgresql-12
Go in PostgreSQL
sudo -u postgres psql
Create user and password
CREATE USER db_user WITH PASSWORD 'db_password';
Create Database dev
CREATE DATABASE db_dev;Add permission User to Database
GRANT ALL PRIVILEGES ON DATABASE db_dev TO db_user; -
Create or update .env file and enter the environment variables of the environment. Example:
# APP configuration APP_NAME="Flask API Rest Template" APP_ENV="develop" # Flask Configuration FLASK_APP= "app:app" FLASK_DEBUG="true" APP_SETTINGS_MODULE="config.DevelopConfig" FLASK_RUN_HOST="0.0.0.0" FLASK_RUN_PORT="5000" # Database service configuration DATABASE_URL="postgresql://db_user:db_password@localhost/db_dev"
-
Run: Create Database
flask create-db
Create User Admin
flask create-user-admin
Run a development server
flask run
Testing environment that uses PostgreSQL as database (db_test) and performs unit tests, integration tests and API tests.
-
Create environment and install packages:
conda create -n backend python=3.9
conda activate backend
pip install -r requirements.txt
-
Create PostgreSQL on Ubuntu 20.04 Install PostgreSQL
sudo apt-get install postgresql-12
Go in PostgreSQL
sudo -u postgres psql
Create user and password
CREATE USER db_user WITH PASSWORD 'db_password';
Create Database test
CREATE DATABASE db_test;Add permission User to Database
GRANT ALL PRIVILEGES ON DATABASE db_test TO db_user; -
Create or update .env file and enter the environment variables of the environment. Example:
# APP configuration APP_NAME="Flask API Rest Template" APP_ENV="testing" # Flask Configuration FLASK_APP= "app:app" FLASK_DEBUG="true" APP_SETTINGS_MODULE="config.TestingConfig" FLASK_RUN_HOST="0.0.0.0" FLASK_RUN_PORT="3000" # Database service configuration DATABASE_TEST_URL="postgresql://db_user:db_password@localhost/db_test"
-
Init database: Create Database
flask create-db
Create User Admin
flask create-user-admin
-
Run all the tests:
pipenv run tests
-
Run unit tests:
pipenv run tests_unit
-
Run integration tests:
pipenv run tests_integration
-
Run API tests:
pipenv run tests_api
-
Run coverage:
pipenv run coverage
-
Run coverage report:
pipenv run coverage_report
Containerized services separately with PostgreSQL databases (db), API (api) and Nginx reverse proxy (nginx) with Docker and docker-compose.
-
Create .env.api.local, .env.db.local files and enter environment variables for each service. In the local environment there are 3 services (api, db, nginx). For example:
- .env.api.local:
# APP configuration APP_NAME=[Name APP] # For example Flask API Rest Template APP_ENV=local # Flask configuration API_ENTRYPOINT=app:app APP_SETTINGS_MODULE=config.LocalConfig APP_TEST_SETTINGS_MODULE=config.TestingConfig # API service configuration API_HOST=<api_host> # For example 0.0.0.0 API_PORT=<port_api> # For example 5000 # Database service configuration DATABASE=postgres DB_HOST=<name_container_bbdd> # For example db_service (name service in docker-compose) DB_PORT=<port_container_bbdd> # For example 5432 (port service in docker-compose) POSTGRES_DB=<name_database> # For example db_dev POSTGRES_USER=<name_user> # For example db_user PGPASSWORD=<password_user> # For example db_password DATABASE_TEST_URL=<url database test> # For example postgresql+psycopg2://db_user:db_password@db_service:5432/db_test DATABASE_URL=<url database> # For example postgresql+psycopg2://db_user:db_password@db_service:5432/db_dev
- .env.db.local:
POSTGRES_USER=<name_user> # For example db_user POSTGRES_PASSWORD=<password> # For example db_password POSTGRES_DB=<name_DB> # For example db_dev
- .env.api.local:
-
Run:
- Build and run services:
docker-compose up --build
- Stop services:
docker-compose stop
- Delete services:
docker compose down
- Remove services (removing volumes):
docker-compose down -v
- Remove services (removing volumes and images):
docker-compose down -v --rmi all
- View services:
docker-compose ps
- Build and run services:
NOTE: The Rest API defaults to host localhost and port 8080.
Apply CI/CD with Github Actions to automatically deployed to AWS platform use EC2, RDS PostgresSQL.
- Create file .env.pro and enter the environment variables needed for production. For example:
- .env.pro:
# APP configuration APP_NAME=Flask API Rest Template APP_ENV=production # Flask configuration API_ENTRYPOINT=app:app APP_SETTINGS_MODULE=config.ProductionConfig # API service configuration API_HOST=<api_host> # For example 0.0.0.0 # Database service configuration DATABASE_URL=<url_database> # For example sqlite:///production.db # Deploy platform PLATFORM_DEPLOY=AWS
- .env.pro:
- Create Secrets on Github:
- AWS_ACCESS_KEY_ID: access token
- AWS_SECRET_ACCESS_KEY: secret access
- AWS_DEFAULT_REGION: region
-
Create all tables in the database:
flask create_db -
Delete all tables in the database:
flask drop_db
-
Create admin user for the Rest API:
flask create-user-admin
-
Database reset:
flask reset-db
-
Run tests without coverage:
flask reset-db
-
Run tests with coverage without report in html:
flask cov
-
Run tests with coverage with report in html:
flask cov-html
-
Create a migration repository:
flask db init
-
Generate a migration version:
flask db migrate -m "Init" -
Apply migration to the Database:
flask db upgrade
http://localhost:port/swagger-ui
Feel free to make any suggestions or improvements to the project.