====== Routes - Url - Redirection ======
===== Routes =====
@app.route("/home")
@app.route("/home/")
def hello(name="tout le monde"):
return "Bonjour " + name
@app.route("/home/user//post/")
def post(name, id):
return "Voici le post " + str(id) + " de " + name
Afficher toutes les routes de l'application :
* Voir [[https://stackoverflow.com/questions/13317536/get-list-of-all-routes-defined-in-the-flask-app|cette discussion sur StackOverflow]]
===== URL =====
La fonction **url_for** renvoie l'adresse selon un nom de fonction :
from flask import url_for
@app.route("/login")
def login():
...
@app.route("/")
def home():
url = url_for("login")
html = "Login" % url
return html
===== URL avec paramètres =====
Pour une route avec paramètres, ajouter les noms des paramètres et leurs
valeurs à la suite du nom de la fonction.
^ | Paramètre non typé |
^ | Paramètre de type **int** |
^ | Paramètre de type **string** |
from flask import url_for
@app.route("/article/")
def article_by_id(id):
return "Voici l'article %d
" % id
@app.route("/article/")
def article_by_slug(slug):
return "Article "%s"
" % slug
@app.route("/")
def home():
url = url_for("article", id=3)
html = "Article n°3" % url
return html
===== Redirection =====
La fonction **redirect** envoie une réponse **HTTP 302** afin de rediriger
vers une autre URL :
from flask import redirect, url_for
@app.route("/admin")
def admin():
if not logged_in:
return redirect(url_for("login"))
...
Pour rediriger vers la même URL de la requête en cours :
from flask import redirect, request
@app.route("/login")
def login():
...
if ...:
return redirect(request.url)
===== Before Request =====
Pour effectuer des traitements à faire lors de chaque requête, par
exemple écrire dans un journal ou initialiser des valeurs dans
l'objet global **g** :
from flask import Flask, g
@app.before_request
def before_request():
g.sidebar_content = ...
Pour limiter l'accès à certaines routes sous certaines conditions (droits, etc.) :
from flask import Flask, request, redirect, url_for
@app.before_request
def before_request():
if request.endpoint == "app.index":
# autoriser l'accès public sans condition
return None
else:
# n'autoriser l'accès que si une condition est définie
if condition:
# accès autorisé
return None
else:
# redirection vers la page de login
return redirect(url_for("app.login"))
===== Error Handler =====
from flask import Flask, render_template
...
@app.errorhandler(404)
def page_not_found(error):
return render_template("404.html"), 404
{% extends "base.html" %}
{% block content %}
Oups, une erreur 404 !!!
{% endblock %}