Flask
Flask
Short introduction guide on Flask. http://flask.pocoo.org/ (Used for XPPL, so to see a more advanced use in connection with database, see XPPL)
Basic Flask
Flask is a microframework for python to create web applications. It basically connects the webserver with your python code.
Install
$ pip install Flask
Simple text serving
from flask import Flask app = Flask(__name__) @app.route("/") def hello(): return "Hello World!"
- with @app.route you can define the url flask respons to.
- the function definition after is mandetory as well as the return.
- everything that comes after return gets sent back to the browser (http GET request)
Run it with:
$ FLASK_APP=hello.py flask run
Paths
You can use any route you like
@app.route("/any/route/you/like")
You can also use variable routes (example for int)
@app.route("/book/<int:id>") def book(id):
as you can see you can grab the variable in the url through the function’s parameter
(example for string)
@app.route("/book/<bookname>") def book(bookname):
Http Methods
Methods like GET or POST (DELETE, PUT…) can be handled by flask
Therefore you need to add the wanted methods to the route definition like:
from flask import Flask app = Flask(__name__) @app.route('/address_to_post', methods= ['POST','GET']) def respond_to_post(): answer = "" if request.method == 'GET': answer = "get" if request.method == 'POST': answer = "get" return answer
with request.method you can determine the incoming kind of request.
Templates
To be able return full html pages, flask uses templates using Jinja to insert variable content.
@app.route('/') def home(): message = "Welcome Home!" return render_template('home.html', message=message)
you can pass as many variables to the template as you want. in this example we pass message to the template:
The html looks something like:
<html> <p>{{message}}</p> <html>
!important: The html file needs to be saved inside a templates folder called "templates" inside your project folder-
Helpful function
404 Page not found
@app.errorhandler(404) def page_not_found(error): """Custom 404 page.""" return render_template('404.html'), 404
Deploying
Running with uwsgi
https://hackersandslackers.dev/deploy-flask-uwsgi-nginx/
Making the systemd service file
See: https://blog.miguelgrinberg.com/post/running-a-flask-application-as-a-service-with-systemd
sudo nano /etc/systemd/system/myflaskapp.service
[Unit]
Description=<a description of your application>
After=network.target
[Service]
User=<username>
WorkingDirectory=<path to your app>
ExecStart=<app start command>
Restart=always
[Install]
WantedBy=multi-user.target
When the service file is new or changed, you need (one time) to:
sudo systemctl daemon-reload
Then you can:
sudo systemctl status myflaskapp sudo systemctl restart myflaskapp sudo systemctl stop myflaskapp
Then finally when you see that start works (checking status, checking that it actually is running , etc)
sudo systemctl enable myflaskapp
Will make the "service" auto start when the pi restarts.