====== 2. REST rozhraní ======
===== Cíle cvičení =====
- procvičení programování v Pythonu
- vytvoření jednoduchého rozhraní pomocí knihovny [[https://flask.palletsprojects.com/en/2.2.x/|Flask]]
- otestování HTTP komunikace pomocí vhodného nástroje, např. [[https://addons.mozilla.org/en-US/firefox/addon/rested/|RESTED]]
===== Jednoduchá webová aplikace =====
Vytvořte zdrojový kód v Pythonu a nazvěte ho např. ''app.py''.
from flask import Flask
app = Flask(__name__)
@app.route('/')
def hello():
return '
Ve výše uvedeném bloku kódu nejprve importujete objekt Flask z balíčku flask. Poté pomocí něj vytvoříte instanci aplikace Flask a dáte jí jméno app. Předáte speciální proměnnou ''__name__'', která obsahuje název aktuálního modulu Pythonu. Toto jméno říká instanci, kde se nachází; potřebujete ho, protože Flask v zákulisí nastavuje některé cesty.
Jakmile vytvoříte instanci aplikace, můžete ji použít ke zpracování příchozích webových požadavků a odesílání odpovědí uživateli. ''@app.route'' je //dekorátor//, který změní běžnou funkci jazyka Python na funkci ''Flask view'', která převede návratovou hodnotu funkce na odpověď HTTP, kterou zobrazí klient HTTP, například webový prohlížeč. Funkci @app.route() předáte hodnotu '/', která znamená, že tato funkce bude odpovídat na webové požadavky na adresu URL /, což je hlavní adresa URL.
Funkce zobrazení ''hello()'' vrátí jako odpověď HTTP řetězec 'Hello, World!
'
export FLASK_APP=app
Poté pomocí proměnné prostředí FLASK_ENV určete, že chcete aplikaci spustit ve vývojovém režimu (abyste mohli pomocí ladicího programu zachytit chyby):
export FLASK_ENV=development
Nakonec aplikaci spusťte pomocí příkazu flask run:
flask run
==== Spuštění v editoru ====
Někdy je výhodné spustit aplikaci bez prostředí Flask, např. přímo v editoru. Pak je třeba vytvořit plnohodnotnou aplikaci, která bude obsahovat hlavní metodu, ve které se vyvořená aplikace spustí.
if __name__ == '__main__':
app.run(host='0.0.0.0', port=5000, debug=True)
===== Specifikace HTTP metody =====
Dalším parametrem metody ''route()'' je možné specifikovat HTTP metodu použitou při dotazu
@app.route('/', methods=["GET"])
from markupsafe import escape
# ...
@app.route('/capitalize//')
def capitalize(word):
return '{}
'.format(escape(word.capitalize()))
V URL může být i více proměnných:
@app.route('/add///')
def add(n1, n2):
return '{}
'.format(n1 + n2)
===== REST rozhraní =====
from flask import Flask, request, jsonify
app = Flask(__name__)
countries = [
{"id": 1, "name": "Thailand", "capital": "Bangkok", "area": 513120},
{"id": 2, "name": "Australia", "capital": "Canberra", "area": 7617930},
{"id": 3, "name": "Egypt", "capital": "Cairo", "area": 1010408},
]
@app.route("/countries", methods=['GET'])
def get_countries():
return jsonify(countries)
@app.route("/countries", methods=['POST'])
def add_country():
if request.is_json:
name = request.json.get('name') # kompletni JSON: request.get_json()
else:
name = request.form.get('name')
return '{}
'.format(name)
===== Zadání 1. miniprojektu =====
Připravte ve frameworku Flask aplikaci, která bude sloužit pro ukládání dat z jednoduchého teploměru. Rozhraní umožňuje následující operace:
* vložení hodnoty
* zobrazení poslední vložené hodnoty
* zobrazení posledních ''N'' vložených hodnot
* smazání ''N'' prvních hodnot