Flask Restful API backend template - project generator/development environment. Can be used by Python developers for quick start on building Restful API on Flask.
- rabbitmq
- redis
- elasticsearch
- logstash
- postgresql
- nginx
- supervisord
- kibana
- apidoc
Extra python libs and validator classes included.
Before installing this project, please, make sure you have installed docker and docker-compose
To install docker execute:
$ curl -fsSL https://get.docker.com -o get-docker.sh
$ sh get-docker.sh
$ pip install docker-compose
Clone this project into your work directory:
$ git clone "https://github.com/trydirect/flask-formula.git"
Then build it with the following command:
$ cd flask-formula
$ ./setup.sh
Add localdomain to your hosts file Linux, OSX:
echo "127.0.0.1 localdomain kibana.localdomain" | sudo tee -a /etc/hosts
Now, let's check it out
$ curl -i localhost/api/v1/hello
HTTP/1.1 200 OK
Server: nginx/1.14.2
Date: Fri, 24 May 2019 15:33:02 GMT
Content-Type: application/json
Content-Length: 14
Connection: keep-alive
Access-Control-Allow-Origin: *
Access-Control-Allow-Headers: X-Requested-With, Content-Type, X-Custom-Header
Access-Control-Allow-Methods: GET, POST, PUT, PATCH, DELETE
"Hello World"
Default kibana creds:
- login: admin
- password: admin
URL | App |
---|---|
http://localhost | Api doc |
http://localhost/api/v1/hello | Api hello endpoint |
http://kibana.localdomain | Kibana dashboard |
- Full Docker integration
- Docker Compose integration and optimization for local development
- Production ready Python web server using Nginx and uWSGI
- Python Flask backend:
- Nginx plus HTTPS certificate generation with Let's Encrypt
The final project structure will look like this:
~/flask_formula$ tree
.
├── backend
│ ├── app
│ │ ├── apidoc.json
│ │ ├── apps
│ │ │ ├── hello
│ │ │ │ ├── __init__.py
│ │ │ │ ├── resource_schemas.py
│ │ │ │ └── views.py
│ │ │ ├── __init__.py
│ │ │ ├── rabbitmq
│ │ │ │ ├── __init__.py
│ │ │ │ ├── resource_schemas.py
│ │ │ │ └── views.py
│ │ │ └── user
│ │ │ ├── forms.py
│ │ │ ├── __init__.py
│ │ │ ├── models.py
│ │ │ ├── resource_schemas.py
│ │ │ └── views.py
│ │ ├── config
│ │ │ ├── acl.py
│ │ │ ├── config.py
│ │ │ ├── config.py.dist
│ │ │ ├── dev.py
│ │ │ ├── __init__.py
│ │ │ ├── nginx.conf
│ │ ├── docs
│ │ ├── __init__.py
│ │ ├── libs
│ │ │ ├── app.py
│ │ │ ├── auth.py
│ │ │ ├── controllers.py
│ │ │ ├── forms.py
│ │ │ ├── __init__.py
│ │ │ ├── models.py
│ │ │ ├── rabbitmq.py
│ │ │ ├── redis_session.py
│ │ │ ├── resource_schemas.py
│ │ │ └── validators.py
│ ├── manage.py
│ ├── migrations
│ │ ├── alembic.ini
│ │ ├── env.py
│ │ ├── README
│ │ ├── script.py.mako
│ │ └── versions
│ │ ├── 9d5e165bc45e_.py
│ │ ├── ce716beab747_.py
│ ├── README.md
│ ├── run.py
│ ├── wsgi.ini
│ └── wsgi.py
├── certs
│ ├── letsencrypt
│ └── ssl
│ ├── cert.pem
│ └── key.pem
├── config.json
├── configs
│ ├── elasticsearch
│ │ └── elasticsearch.yml
│ ├── logstash
│ │ ├── Dockerfile
│ │ ├── logstash.conf
│ │ └── templates
│ │ ├── filebeat.template.json
│ │ ├── packetbeat.template.json
│ │ └── topbeat.template.json
│ ├── nginx
│ │ ├── conf.d
│ │ │ ├── flask_formula.conf
│ │ ├── letsencrypt-conf.d
│ │ │ └── flask_formula.conf
│ │ ├── nginx.conf
│ │ └── ssl-conf.d
│ │ └── flask_formula.conf
│ ├── postgresql
│ │ └── pg_hba.conf
│ ├── supervisord
│ │ ├── flask_formula.conf
│ │ └── nginx.conf
│ ├── systemd
│ │ └── flask_formula.service
│ └── upstart
│ └── flask_formula.sh
├── cron
│ └── root
├── docker-compose.yml
├── docker-firewall.sh
├── elasticsearch
│ └── data
│ └── nodes
│ └── 0
│ ├── node.lock
│ └── _state
│ └── node-157.st
├── flask_app.tar.gz
├── init-user-db.sh
├── nginx
│ ├── conf.d
│ │ └── flask_formula.conf
│ ├── letsencrypt-conf-d
│ ├── nginx.conf
│ └── ssl-conf.d
├── nginx_original
│ ├── conf.d
│ │ └── flask_formula.conf
│ ├── letsencrypt-conf.d
│ │ └── flask_formula.conf
│ └── ssl-conf.d
│ └── flask_formula.conf
├── scripts
└── supervisord
├── flask_formula.conf
└── nginx.conf
$ docker-compose ps
Name Command State Ports
------------------------------------------------------------------------------------------------------------------------------
db docker-entrypoint.sh postgres Up (healthy) 5432/tcp
elasticsearch /docker-entrypoint.sh elas ... Up 9200/tcp, 9300/tcp
flask_formula_pmm_1 docker-entrypoint.sh postgres Up 5432/tcp
kibana /docker-entrypoint.sh kibana Up 0.0.0.0:5601->5601/tcp
logstash /docker-entrypoint.sh -e Up 0.0.0.0:5044->5044/tcp
mq docker-entrypoint.sh rabbi ... Up (healthy) 15671/tcp, 0.0.0.0:21072->15672/tcp, 25672/tcp, 4369/tcp, 5671/tcp, 0.0.0.0:2172->5672/tcp,0.0.0.0:32770->5672/tcp
nginx /usr/bin/supervisord -c /e ... Up 0.0.0.0:443->443/tcp, 0.0.0.0:80->80/tcp
redis docker-entrypoint.sh redis ... Up (healthy) 6379/tcp
web /usr/bin/supervisord -c /e ... Up 0.0.0.0:8000->8000/tcp
$ ./scripts/apidoc.sh
- Fork it (https://github.com/trydirect/flask-formula/fork)
- Create your feature branch (git checkout -b feature/fooBar)
- Commit your changes (git commit -am 'Add some fooBar')
- Push to the branch (git push origin feature/fooBar)
- Create a new Pull Request