Redirection vers URL dans Flask

227

Je suis nouveau sur Python et Flask et j'essaie de faire l'équivalent de Response.redirectC # - c'est-à-dire: rediriger vers une URL spécifique - comment faire?

Voici mon code:

import os
from flask import Flask

app = Flask(__name__)

@app.route('/')
def hello():
    return 'Hello World!'

if __name__ == '__main__':
    # Bind to PORT if defined, otherwise default to 5000.
    port = int(os.environ.get('PORT', 5000))
    app.run(host='0.0.0.0', port=port)
iJade
la source

Réponses:

365

Vous devez renvoyer une redirection:

import os
from flask import Flask,redirect

app = Flask(__name__)

@app.route('/')
def hello():
    return redirect("http://www.example.com", code=302)

if __name__ == '__main__':
    # Bind to PORT if defined, otherwise default to 5000.
    port = int(os.environ.get('PORT', 5000))
    app.run(host='0.0.0.0', port=port)

Voir la documentation sur la documentation des flacons. La valeur par défaut du code est 302 et code=302peut donc être omise ou remplacée par un autre code de redirection (un parmi 301, 302, 303, 305 et 307).

Xavier Combelle
la source
95
#!/usr/bin/env python
# -*- coding: utf-8 -*-

import os
from flask import Flask, redirect, url_for

app = Flask(__name__)

@app.route('/')
def hello():
    return redirect(url_for('foo'))

@app.route('/foo')
def foo():
    return 'Hello Foo!'

if __name__ == '__main__':
    # Bind to PORT if defined, otherwise default to 5000.
    port = int(os.environ.get('PORT', 5000))
    app.run(host='0.0.0.0', port=port)

Jetez un œil à l' exemple de la documentation .

soerface
la source
2
notez que vous transmettez le nom de la fonction dans url_forlaquelle puis construit une URL qui est transmise pour rediriger et vous le retournez.
Sunvic
40

Dans la documentation de l'API Flask (v. 0.10):

ballon. redirection ( location, code=302, Response=None)

Renvoie un objet de réponse (une application WSGI) qui, s'il est appelé, redirige le client vers l'emplacement cible. Les codes pris en charge sont 301, 302, 303, 305 et 307. 300 n'est pas pris en charge car ce n'est pas une véritable redirection et 304 car c'est la réponse à une demande avec une demande avec des en-têtes If-Modified-Since définis.

Nouveau dans la version 0.6 : l'emplacement peut désormais être une chaîne unicode qui est encodée à l'aide de la fonction iri_to_uri ().

Paramètres:

  • location - l'emplacement vers lequel la réponse doit être redirigée.
  • code- le code d'état de redirection. par défaut à 302.
  • Response(classe) - une classe Response à utiliser lors de l'instanciation d'une réponse. La valeur par défaut est werkzeug.wrappers.Response si non spécifié.
gué
la source
13

Je pense que cette question mérite une mise à jour: jetez un œil aux autres approches et faites des comparaisons.

Voici comment vous effectuez la redirection (3xx) d'une URL vers une autre dans Flask (0.12.2):

#!/usr/bin/env python

from flask import Flask, redirect

app = Flask(__name__)

@app.route("/")
def index():
    return redirect('/you_were_redirected')

@app.route("/you_were_redirected")
def redirected():
    return "You were redirected. Congrats :)!"

if __name__ == "__main__":
    app.run(host="0.0.0.0",port=8000,debug=True)

Pour d'autres références officielles, ici .

ivanleoncz
la source
5
flask.redirect(location, code=302)

Les documents peuvent être trouvés ici .

der_fenix
la source
5

Flask comprend la redirectfonction de redirection vers n'importe quelle URL. De plus, vous pouvez annuler une demande plus tôt avec un code d'erreur avec abort:

from flask import abort, Flask, redirect, url_for

app = Flask(__name__)

@app.route('/')
def hello():
    return redirect(url_for('hello'))

@app.route('/hello'):
def world:
    abort(401)

Par défaut, une page d'erreur en noir et blanc s'affiche pour chaque code d'erreur.

La redirectméthode prend par défaut le code 302. Une liste des codes d'état http ici .

yoelvis
la source
1

Vous pouvez utiliser comme ceci:

import os
from flask import Flask

app = Flask(__name__)

@app.route('/')
def hello():
     # Redirect from here, replace your custom site url "www.google.com"
    return redirect("https://www.google.com", code=200)

if __name__ == '__main__':
    # Bind to PORT if defined, otherwise default to 5000.
    port = int(os.environ.get('PORT', 5000))
    app.run(host='0.0.0.0', port=port)

Voici le lien référencé vers ce code.

RAJAHMAD MULANI
la source
1

Pour cela, vous pouvez simplement utiliser la redirectfonction incluse dansflask

from flask import Flask, redirect

app = Flask(__name__)

@app.route('/')
def hello():
    return redirect("https://www.exampleURL.com", code = 302)

if __name__ == "__main__":
    app.run()

Une autre astuce utile (comme vous êtes nouveau dans le flacon), est d'ajouter app.debug = Trueaprès avoir initialisé l'objet flask car la sortie du débogueur aide beaucoup tout en découvrant ce qui ne va pas.

Manan Gouhari
la source