====== 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 %}