Flusk
Flask - SQLAlchemy's declarative base - Docker - custom middleware.
Specifications
Application factory
Factories helps in creating many instances of the application. In this project, testing environment creates a new app instance whenever tests are ran.
Blueprints
Blueprints helps to split large application in small modular packages (one would say - similar to django apps
).
Logic separation
The logic is splitted in the following layers:
backend
(persistence layer) - where resides the code to read/write/delete records to disk or databasedomain
(domain layer) - where resides the bussines logic and external api integrations, i/o operations for a blueprintviews
(presentation layer) - knows only about HTTPrequest
andresponse
. Its duty is to process a request and pass data to lower layers and to return responses.models
(data model layer) - where all blueprint models are defined
Middleware
The application tends to use middlewares instead of decorators or custom functions across the project.
- application/json requests - ensures that all incoming requests are of
application/json
Content-Type - schema validation - validates the request payload against a JSON Schema
- cors - allow cors requests for consumer apps
- json exceptions - custom exception handler used to raise JSON exceptions
- json responses - custom response handler used to return JSON objects
Extensions
The project tends to use the framework agnostic extensions over the flask ones, because they are usually wrappers and besides that, they may add additional functionality that you don't actually need (e.g. managers)
Docker
Ensures that the application you develop on local machine, behaves exactly in production.
Directory layout
.
โโโ core # main codebase for the application
โย ย โโโ api # API specific codebase
โย ย โย ย โโโ common # shared logic used by the application
โย ย โย ย โย ย โโโ database.py # common database logic
โย ย โย ย โย ย โโโ exceptions.py # custom exception classes
โย ย โย ย โย ย โโโ __init__.py
โย ย โย ย โย ย โโโ middleware # application middleware
โย ย โย ย โย ย โย ย โโโ __init__.py # define application middlewares
โย ย โย ย โย ย โย ย โโโ request.py # `request` related middleware
โย ย โย ย โย ย โย ย โโโ response.py # `response` related middleware
โย ย โย ย โย ย โโโ serializers.py # custom defined serializers
โย ย โย ย โย ย โโโ validation.py # JSON schema validation logic
โย ย โย ย โโโ conftest.py # pytest configurations and custom fixtures
โย ย โย ย โโโ foss # flask blueprint
โย ย โย ย โย ย โโโ backend.py # logic related to database queries
โย ย โย ย โย ย โโโ domain.py # business logic and external integrations
โย ย โย ย โย ย โโโ __init__.py # blueprint config
โย ย โย ย โย ย โโโ models.py # blueprint models
โย ย โย ย โย ย โโโ tests # blueprint tests
โย ย โย ย โย ย โย ย โโโ __init__.py
โย ย โย ย โย ย โย ย โโโ test_unit.py # unit tests
โย ย โย ย โย ย โย ย โโโ test_integration.py # integration tests
โย ย โย ย โย ย โย ย โโโ test_models.py # database models tests
โย ย โย ย โย ย โโโ views.py # logic related to request -> response
โย ย โย ย โโโ __init__.py # app factory, blueprints, errorhandler and middleware registration
โย ย โย ย โโโ specifications # API specifications, RAML files and JSON schemas
โย ย โย ย โโโ schemas # JSON schemas folder
โย ย โย ย โโโ foss # schemas for a specific blueprint
โย ย โย ย โโโ create_foss.json # endpoint/view/route schema
โย ย โย ย โโโ update_foss.json # endpoint/view/route schema
โย ย โโโ Dockerfile # Dockerfile for the flask application
โย ย โโโ requirements.txt # application dependencies
โย ย โโโ run.py # application creation and running
โโโ docker-compose.yml # Dockerfiles manager
โโโ Makefile # set of useful tasks (make `targets`)
โโโ nginx # nginx docker image related information
โย ย โโโ Dockerfile # Dockerfile for the nginx web server
โย ย โโโ sites-enabled
โย ย โโโ nginx.conf # nginx configuration
โโโ README.md
Prerequisites
- Python 3.5
- Docker
Installation
Clone the repository
git clone https://github.com/dimmg/flusk.git
Build and run docker images
make dcompose-start
Run application
-
Development
SSH into the running
api
container and start the development serverdocker exec -it flusk_api_1 bash python run.py
By having a running server, execute
docker inspect flusk_nginx_1
where
IPAddress
it is the address of the running application. -
Production
Change
docker-compose.yml
file as follows:command: gunicorn -w 1 -b 0.0.0.0:5000 run:wsgi # tail -f /dev/null
Rebuild the images via
make dcompose-restart
After rebuilding, the
gunicorn
wsgi server is running in background.To get the address of the running web server container run
docker inspect flusk_nginx_1
Migrations
Migrations are done using the alembic
migration tool.
Flow
- make changes to your models when needed
- create a migration
- check the migration script and modify it as needed
- apply the migration
Commands
- create migration
make db-revision msg=<..message..>
- apply the last migration
make db-upgrade
- get the raw SQL for the last migration
make db-upgrade-sql
Note that these are the basic migration commands. To get the most from alembic, use the original $ alembic
runner.