Zbudowanie webowego API w języku Python z wykorzystaniem Flask API nie jest skomplikowane. W poniższym poście przedstawię podstawowe przykłady użycia framework’a, a także proste sposoby jego przetestowania. Gotowe API można uruchomić np. na UWSGI, o czym pisałem miesiąc temu.
Import modułów Link to heading
Szkielet przykładowej aplikacji jest prosty i składa się z importu modułów oraz uruchomienia programu:
from flask import Flask from flask import request from flask import render_template from flask import abort, redirect, url_for, make_response # ... app = Flask(__name__) Flask jest głównym modułem framework’a, request umożliwia dostęp do żądania otrzymanego przez serwer, render_template pozwala wykorzystywać szablony w plikach HTML, abort, redirect, url_for oraz make_response są użytecznymi modułami do obsługi błędów, przekierowania oraz modyfikowania nagłówka odpowiedzi HTTP.
Obsługa żądań HTTP GET Link to heading
Najprostszy kod obsługujący żądania HTTP GET składa się z 3 elementów - dekoratora route defniującego URL, pod którym dostępny jest serwis, nazwy funkcji oraz jej logiki (w tym przypadku zwrócenie ciągu znaków):
@app.route('/') def index(): return 'HTTP GET index Page'
Obsługa żądań HTTP POST Link to heading
Poniższy przykład jest bardziej skomplikowany, ponieważ został rozbudowany o:
- parametry przekazywane w URL,
- określenie typów żądań HTTP, które są obsługiwane (GET, POST),
- odczyt danych przekazanych jako parametry URL oraz dane z formularza.
@app.route('/user/<username>', methods=['GET', 'POST']) def show_user_profile(username): if request.method == 'POST': return 'HTTP POST for user %s with password %s' % (username, request.form['password']) else: return 'HTTP GET for user %s' % username
Wykorzystanie szablonów stron HTML Link to heading
W przypadku bardziej rozbudowanych odpowiedzi warto skorzystać z szablonów, do których możemy przekazać parametry jak w przykładzie poniżej:
@app.route('/template/<name>') def template(name=None): return render_template('template.html', name=name)
Obsługa błędów Link to heading
Kody błędów zwracane przez API można w prosty sposób generować przez funkcję abort(), wykorzystać szablony, czy też dodatkowo modyfikować dane w nagłówku HTTP:
@app.route('/error_denied') def error_denied(): abort(401) @app.route('/error_internal') def error_internal(): return render_template('template.html', name='ERROR 505'), 505 @app.route('/error_not_found') def error_not_found(): response = make_response(render_template('template.html', name='ERROR 404'), 404) response.headers['X-Something'] = 'A value' return response
Testowanie API Link to heading
Najprostrzym sposobem przetestowania API jest jego uruchomienie za pomocą poleceń:
export FLASK_APP=example.py export FLASK_DEBUG=1 flask run
a następnie wygenerowanie żądań za pomocą curl:
curl http://127.0.0.1:5000/ curl http://127.0.0.1:5000/user/seba curl -X POST http://127.0.0.1:5000/user/seba -d "password=secret" curl http://127.0.0.1:5000/template/test curl http://127.0.0.1:5000/error_denied curl http://127.0.0.1:5000/error_internal curl http://127.0.0.1:5000/error_not_found