Przekierowanie do adresu URL w Flask

226

Jestem nowy w Pythonie i Flasku i próbuję zrobić odpowiednik Response.redirectjak w C # - tj. Przekierować do konkretnego adresu URL - jak to zrobić?

Oto mój kod:

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
źródło

Odpowiedzi:

364

Musisz zwrócić przekierowanie:

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)

Zobacz dokumentację dotyczącą dokumentów flask. Domyślną wartością kodu jest 302, więc code=302można go pominąć lub zastąpić innym kodem przekierowania (jeden na 301, 302, 303, 305 i 307).

Xavier Combelle
źródło
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)

Spójrz na przykład w dokumentacji .

powierzchnia
źródło
2
zwróć uwagę, że przekazujesz nazwę funkcji, na url_forktórą następnie budowany jest adres URL, który jest przekazywany do przekierowania i zwracasz go.
Sunvic
40

Z dokumentacji Flask API (v. 0.10):

kolba. przekierowania ( location, code=302, Response=None)

Zwraca obiekt odpowiedzi (aplikację WSGI), który po wywołaniu przekierowuje klienta do lokalizacji docelowej. Obsługiwane kody to 301, 302, 303, 305 i 307. 300 nie jest obsługiwane, ponieważ nie jest to prawdziwe przekierowanie, a 304, ponieważ jest to odpowiedź na żądanie z żądaniem ze zdefiniowanymi nagłówkami If-Modified-Since.

Nowości w wersji 0.6 : Lokalizacja może być teraz ciągiem Unicode, który jest kodowany za pomocą funkcji iri_to_uri ().

Parametry:

  • location - lokalizacja, na którą odpowiedź powinna przekierować.
  • code- kod statusu przekierowania. domyślnie 302.
  • Response(klasa) - klasa odpowiedzi używana podczas tworzenia odpowiedzi. Wartość domyślna to werkzeug.wrappers.Response, jeśli nie jest określona.
bród
źródło
13

Uważam, że to pytanie zasługuje na aktualizację: wystarczy spojrzeć na inne podejścia i dokonać porównań.

Oto jak przekierowujesz (3xx) z jednego adresu URL na inny w 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)

Tutaj znajdziesz inne oficjalne referencje .

ivanleoncz
źródło
5
flask.redirect(location, code=302)

Dokumenty można znaleźć tutaj .

der_fenix
źródło
5

Kolba zawiera redirectfunkcję przekierowywania na dowolny adres URL. Ponadto można wcześniej przerwać żądanie za pomocą kodu błędu za pomocą 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)

Domyślnie dla każdego kodu błędu wyświetlana jest czarno-biała strona błędu.

redirectMetoda trwa domyślnie listę kodem 302. http kodów stanu tutaj .

yoelvis
źródło
1

W tym celu możesz po prostu użyć redirectfunkcji zawartej wflask

from flask import Flask, redirect

app = Flask(__name__)

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

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

Kolejną przydatną wskazówką (gdy app.debug = Truedopiero zaczynasz flaskować), jest dodanie po zainicjowaniu obiektu flask, ponieważ dane wyjściowe debuggera bardzo pomagają, jednocześnie zastanawiając się, co jest nie tak.

Manan Gouhari
źródło
1

Możesz użyć w ten sposób:

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("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)

Oto odnośnik do tego kodu.

RAJAHMAD MULANI
źródło