Flask: Difference between revisions

From XPUB & Lens-Based wiki
Line 104: Line 104:


== Deploying ==
== Deploying ==
See: https://blog.miguelgrinberg.com/post/running-a-flask-application-as-a-service-with-systemd


   sudo nano /etc/systemd/system/myflaskapp.service
   sudo nano /etc/systemd/system/myflaskapp.service
Line 121: Line 124:
WantedBy=multi-user.target
WantedBy=multi-user.target
</source>
</source>
When the service file is new or changed, you need (one time) to:
    sudo systemctl daemon-reload


Then you can:
Then you can:
Line 127: Line 135:
     sudo systemctl restart myflaskapp
     sudo systemctl restart myflaskapp
     sudo systemctl stop 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.

Revision as of 11:48, 7 June 2022

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

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.