Warning
This page is located in archive. Go to the latest version of this course pages. Go the latest version of this page.

2. REST rozhraní

Cíle cvičení

  1. procvičení programování v Pythonu
  2. vytvoření jednoduchého rozhraní pomocí knihovny Flask
  3. otestování HTTP komunikace pomocí vhodného nástroje, např. 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 '<h1>Hello, World!</h1>'

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 '<h1>Hello, World!</h1>'.

Nyní máte jednoduchou aplikaci Flask v souboru Python s názvem app.py, v dalším kroku aplikaci spustíte a uvidíte výsledek funkce zobrazení hello() vykreslený ve webovém prohlížeči.

Spuštění aplikace

Aplikaci napsanou pomocí frameworku Flask lze spustit dvěme způsoby.

Spuštění v prostředí Flask

Nejprve v adresáři flask_app s aktivovaným virtuálním prostředím sdělte Flasku, kde má najít aplikaci (ve vašem případě app.py), pomocí proměnné prostředí FLASK_APP následujícím příkazem (v systému Windows použijte set místo export):

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"])

Zkuste rozšířit aplikační rozhraní.

Dynamické směrování

Rozšiřte aplikaci o následující kód

from markupsafe import escape
 
# ...
 
 
@app.route('/capitalize/<word>/')
def capitalize(word):
    return '<h1>{}</h1>'.format(escape(word.capitalize()))

V URL může být i více proměnných:

@app.route('/add/<int:n1>/<int:n2>/')
def add(n1, n2):
    return '<h1>{}</h1>'.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 '<h1>{}</h1>'.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
courses/b0b37nsi/tutorials/02.txt · Last modified: 2023/03/02 08:31 by viteks