I mitt projekt med GeoRover så behöver jag koppla ihop ett webbinterface med python, så att användaren kan anropa olika skript från gränssnittet och även se resultat från dessa.
I detta inlägg kikar jag lite på Flask, som är ett ramverk för webbutveckling med Python.
Jag kommer så småningom att behöva installera ett ramverk fullständigt, men så länge följer jag rekommendationen att installera i en virtuell miljö:
sudo apt-get install python-virtualenv mkdir testprojekt cd testprojekt virtualenv venv . venv/bin/activate
Ovanstående skapar en virtuell miljö där jag kan experimentera bäst jag vill, och när jag vill ”hoppa ur” denna miljö så skriver jag in kommandot: deactivate
Flask installeras i den virtuella miljön med ett pip-kommando:
sudo pip install Flask
Jag börjar med det obligatoriska ”Hello World”, genom att skapa en fil som jag döper till ”hello.py”, med följande innehåll:
from flask import Flask app = Flask(__name__) @app.route('/') def hello_world(): return 'Hello World!'
Mycket kortfattat så kommer skriptet att lyssna efter en adress och om det är ’/’, det vill säga roten på webbservern så svarar den med texten ’Hello World!’.
Det går med andra ord att byta ut denna text mot en text som är en hel hemsida, eller välja att lyssna efter flera olika adresser för att ge olika texter som svar.
Skriptet skall exporteras till flask och sedan skall servern startas:
export FLASK_APP=hello.py flask run --host=0.0.0.0
Tillägget med –host=0.0.0.0 behövs om man vill komma åt servern från en annan dator än den lokala, så om du provar på en egen dator så kan du strunta i detta, men om du som jag kör på en Raspberry Pi och vill komma åt den via nätverket och enhetens IP-adress så.
För att få Flask att köra ett skript så kan man använda ”POST” (jag behövde även ”GET” i methods), vilket jag enkelt kan testa genom att modifiera pythonskriptet något. Importera ”request” från flask, samt mitt egentillverkade ”test”, som är ett enkelt pythonskript som bara returnerar en text när anropet till funktionen ”test()” utförs, men det skulle kunna vara hur avancerat som helst (fånga waypoint?).
När jag anger adressen ”/rover” i webbläsaren så får jag fram en knapp med texten ”Tryck”. När jag trycker på denna så körs mitt pythonskript och jag får ett svar som skrivs till skärmen.
Jag skulle kunna göra hela mitt gränssnitt på detta sätt. En lista med knappar som alltid skrivs till skärmen, och en funktion som fångar ”POST” från dessa och kör olika skript beroende på vilken knapp som tryckts ner. Då måste jag dock kunna skilja ut vilken knapp som tryckts ned.
Genom att namnge alla knappar till samma namn, exempelvis ”knapp”, så kan jag kontrollera med ett ”form” kommando vilket värde (value) som den nedtryckta knappen har, och därmed koppla knappar till olika händelser.
<input type="submit" name="knapp" value="Skapa WP">
if request.form['knapp'] == 'Skapa WP': gor_något()
Strålande!