Requête et réponse Flask

Le cœur d'une application web est "recevoir des requêtes et renvoyer des réponses". Ce chapitre explique de manière complète comment lire les données de requête et construire divers types de réponses dans Flask.

Tous les exemples peuvent être directement exécutés et vérifiés dans le serveur de développement.


Objet de requête — request

Flask fournit toutes les informations de requête via un objet proxy global.requestToutes les informations de requête sont fournies.

Bien qu'il s'agisse d'un objet "global", Flask utilise en interne l'isolation de thread pour garantir que chaque requête dispose de ses propres données.

Exemple

# Importer request, un objet proxy thread-safe
from flask import Flask, request

app = Flask(__name__)

@app.route("/debug")
def debug():
    # Afficher diverses informations de requête pour aider à comprendre l'objet request
    return f"""
<h1>Informations de débogage de la requête</h1>
    <ul>
<li>Méthode : {request.method}</li>
<li>Chemin : {request.path}</li>
<li>URL complète : {request.url}</li>
<li>Hôte : {request.host}</li>
<li>IP client : {request.remote_addr}</li>
        <li>User-Agent:{request.headers.get('User-Agent')}</li>
    </ul>
    """

Visitezhttp://127.0.0.1:5000/debug?foo=barVous pouvez voir les informations détaillées de la requête.


Obtenir les paramètres de requête — request.args

Dans l'URL?Les paramètres qui la suivent sont appelés paramètres de requête (Query String).

Utilisationrequest.argsEn le lisant, il fonctionne comme un dictionnaire :

Exemple

@app.route("/search")
def search():
    # request.args.get() récupère le paramètre en toute sécurité, renvoie None lorsque la clé n'existe pas
    keyword = request.args.get("keyword", "")  # Obtenir le mot-clé de requête
    page = request.args.get("page", "1")       # Obtenir le numéro de page, 1 par défaut
    return f"""
<h1>Résultats de recherche</h1>
<p>Mot-clé : {keyword}</p>
<p>Page : {page}</p>
    """

# Test : /search?keyword=flask&page=2
# Test : /search?keyword=EXAMPLE

Recommandé.get()Utilisez la méthode au lieu d'un accès direct par indice.request.args["key"], car ce dernier lève une exception lorsque la clé n'existe pas.KeyError, ce qui entraîne une page d'erreur 400.


Obtenir les données de formulaire — request.form

Pour gérer les données de formulaire envoyées par des requêtes POST, utilisezrequest.form:

Exemple

@app.route("/register", methods=["GET", "POST"])
def register():
    if request.method == "POST":
        # Utiliser la valeur du champ name="username" dans le formulaire
        username = request.form.get("username", "")
        password = request.form.get("password", "")

        if not username or not password:
            return "<h1>Erreur</h1><p>Le nom d'utilisateur et le mot de passe ne peuvent pas être vides</p>", 400

        return f"<h1>Inscription réussie</h1><p>Bienvenue {username} sur EXAMPLE !</p>"

    # Afficher le formulaire d'inscription lors d'une requête GET
    return """
<h1>Inscription</h1>
    <form method="post">
<p>Nom d'utilisateur : <input type="text" name="username"></p>
<p>Mot de passe : <input type="password" name="password"></p>
<p><input type="submit" value="S'inscrire"></p>
    </form>
    """

Remarque : dans la page HTML qui gère le formulaire,<form>doit être défini avecmethod="post", sinon les données seront envoyées via la chaîne de requête de l'URL (méthode GET), et des informations sensibles seront exposées dans l'URL.


Obtenir des données JSON — request.json

Dans le développement web moderne, JSON est le format de données le plus courant.

Lorsque le client envoie, avecContent-Type: application/json, une requête, utilisezrequest.jsonpour obtenir les données analysées :

Exemple

@app.post("/api/user")
def create_user():
    # request.json renvoie des données JSON déjà analysées dans un dictionnaire Python
    data = request.json  # Par exemple, le client envoie {"name": "example", "email": "[email protected]"}

    # Récupérer le champ en toute sécurité
    name = data.get("name", "Inconnu")
    email = data.get("email", "Non fourni")

    # Renvoyer directement un dict, Flask le convertit automatiquement en réponse JSON
    return {
        "message": "Utilisateur créé avec succès",
        "name": name,
        "email": email
    }

Peut être utilisécurlou Postman pour tester :

$ curl -X POST http://127.0.0.1:5000/api/user \
  -H "Content-Type: application/json" \
  -d '{"name": "example", "email": "[email protected]"}'
{
  "message": "用户创建成功",
  "name": "example",
  "email": "[email protected]"
}

Téléversement de fichier

Utilisez ceci pour gérer les fichiers téléversés :request.files, combiné avec la fonction fournie par Werkzeugsecure_filename()Assurez-vous que le nom du fichier est sécurisé :

Exemple

import os
from werkzeug.utils import secure_filename  # Filtrer les caractères dangereux des noms de fichiers

# Configurer le répertoire de téléversement (dans un vrai projet, ceci devrait être lu depuis la configuration)
UPLOAD_DIR = "uploads"

@app.route("/upload", methods=["GET", "POST"])
def upload_file():
    if request.method == "POST":
        # Vérifier si un fichier a été téléversé
        if "file" not in request.files:
            return "Aucun fichier sélectionné", 400

        file = request.files["file"]

        # L'utilisateur a peut-être soumis un formulaire vide (aucun fichier sélectionné)
        if file.filename == "":
            return "Le nom de fichier est vide", 400

        # secure_filename filtre les caractères dangereux tels que la traversée de chemin
        # Par exemple, "../../etc/passwd" serait traité comme "etc_passwd"
        filename = secure_filename(file.filename)

        # Vérifier que le répertoire de téléversement existe
        os.makedirs(UPLOAD_DIR, exist_ok=True)

        # Enregistrer le fichier
        file.save(os.path.join(UPLOAD_DIR, filename))
        return fFichier {filename} téléversé avec succès

    # La requête GET affiche le formulaire de téléversement
    return """
<h1>Téléverser un fichier</h1>
    <form method="post" enctype="multipart/form-data">
        <p><input type="file" name="file"></p>
<p><input type="submit" value="Téléverser"></p>
    </form>
    """

Si le formulaire a un champ de téléversement de fichier,<form>Le libellé doit être définienctype="multipart/form-data", sinon les données du fichier ne seront pas envoyées par le navigateur.


Guide complet des types de réponse

Les fonctions de vue peuvent renvoyer plusieurs types de données, et Flask les convertira automatiquement en réponses HTTP appropriées.

Comprendre cette règle de conversion est la clé pour maîtriser Flask.

Retourner une chaîne

La chaîne renvoyée sert de corps de réponse HTML, avec un code d'état par défaut de 200 et un Content-Type detext/html。

Renvoie un dictionnaire ou une liste (JSON)

Appelé automatiquementjsonify()convertit en réponse JSON, avec Content-Type défini surapplication/json。

Exemple

@app.get("/api/posts")
def get_posts():
    # Renvoie un dict, Flask convertit automatiquement en JSON
    return {
        "status": "ok",
        "data": [
            {"id": 1, "title": Tutoriel Flask},
            {"id": 2, "title": Conception d'API RESTful},
        ]
    }

@app.get("/api/tags")
def get_tags():
    # Renvoie une liste, Flask convertit automatiquement en JSON
    return ["Python", "Flask", Développement web, "EXAMPLE"]

Renvoi d'un tuple — contrôle du code de statut et des en-têtes de réponse

Le format de tuple est très pratique et comporte trois formes :

Exemple

# Forme 1 : (body, status_code)
@app.get("/not-found")
def not_found():
    return <h1>Page introuvable</h1>, 404

# Forme 2 : (body, headers_dict)
@app.get("/custom-header")
def custom_header():
    return "OK", {"X-Custom-Header": "example"}

# Forme 3 : (body, status_code, headers_dict)
@app.post("/api/login")
def api_login():
    # Renvoie le jeton et un code de statut personnalisé
    return {"token": "abc123", "user": "example"}, 201, {"X-RateLimit": "100"}

Redirect

Utilisationredirect()La fonction redirige l'utilisateur vers une autre URL :

Exemple

from flask import Flask, redirect, url_for

app = Flask(__name__)

@app.route("/")
def index():
    # Rediriger vers la page de connexion lors de la visite de la page d'accueil
    return redirect(url_for("login"))

@app.route("/login")
def login():
    return <h1>Veuillez d'abord vous connecter</h1>

@app.route("/old-page")
def old_page():
    # Ancienne page définitivement déplacée vers une nouvelle page, utilisez le code de statut 301
    return redirect(url_for("new_page"), code=301)

@app.route("/new-page")
def new_page():
    return <h1>Ceci est une nouvelle page</h1>

Le code de statut de redirection par défaut est303 See Other, adapté pour rediriger après la soumission d'un formulaire (modèle PRG).

Pour les scénarios de migration permanente, utilisezcode=301。


Terminer la requête — abort

Utilisationabort()Termine immédiatement la requête en cours et renvoie une erreur HTTP :

Exemple

from flask import abort

@app.route("/post/<int:post_id>")
def view_post(post_id):
    # Supposons que les ID d'article soient uniquement 1-100
    if post_id < 1 or post_id > 100:
        # Renvoyer immédiatement 404, le code suivant ne sera pas exécuté
        abort(404)

    return f"<h1>Article #{post_id}</h1>"

@app.route("/admin")
def admin():
    # Renvoyer 403 pour un accès non autorisé
    abort(403, description=Vous n'avez pas la permission d'accéder à cette page)

make_response — contrôler manuellement la réponse

Lorsque vous devez définir manuellement des cookies ou personnaliser les en-têtes de réponse, utilisezmake_response():

Exemple

from flask import make_response

@app.route("/set-cookie")
def set_cookie():
    # make_response encapsule la valeur de retour de la fonction de vue dans un objet Response
    resp = make_response(<h1>Cookie défini</h1>)

    # Définir le cookie sur l'objet Response
    resp.set_cookie("theme", "dark", max_age=60*60*24)  # Valable pendant 24 heures
    resp.set_cookie("lang", "zh-CN")

    # Vous pouvez également personnaliser les en-têtes de réponse
    resp.headers["X-Powered-By"] = "EXAMPLE-Flask"

    return resp

Tableau de référence rapide des attributs de requête courants

Propriété Type Description Valeur d'exemple
request.method str Méthode de requête HTTP "GET", "POST"
request.path str Chemin d'URL (sans nom de domaine) "/search"
request.args MultiDict Paramètres de requête URL ?keyword=flask&page=1
request.form MultiDict Données de formulaire POST username=admin
request.json dict ou None Corps de requête JSON (analysé) {"name": "example"}
request.files FileMultiDict Fichier téléversé request.files["avatar"]
request.headers En-têtes En-têtes de requête request.headers["User-Agent"]
request.cookies dict Cookie envoyé par le client request.cookies.get("theme")
request.remote_addr str Adresse IP du client "127.0.0.1"
autres extensions