การเปลี่ยนเส้นทางไปยัง URL ใน Flask


226

ฉันยังใหม่กับ Python และ Flask และฉันพยายามทำสิ่งที่เทียบเท่าResponse.redirectใน C # - เช่น: เปลี่ยนเส้นทางไปยัง URL ที่เฉพาะเจาะจง - ฉันจะทำสิ่งนี้อย่างไร

นี่คือรหัสของฉัน:

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)

คำตอบ:


364

คุณต้องส่งคืนการเปลี่ยนเส้นทาง:

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)

ดูเอกสารเกี่ยวกับขวดเอกสาร ค่าเริ่มต้นสำหรับรหัสคือ 302 ดังนั้นcode=302สามารถละเว้นหรือแทนที่ด้วยรหัสการเปลี่ยนเส้นทางอื่น ๆ (หนึ่งใน 301, 302, 303, 305 และ 307)


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)

ลองดูที่เป็นตัวอย่างในเอกสาร


2
โปรดทราบว่าคุณกำลังส่งชื่อฟังก์ชั่นurl_forซึ่งจะสร้าง URL ที่ถูกส่งผ่านเพื่อเปลี่ยนเส้นทางและคุณส่งคืน
Sunvic

40

จากFlask API Documentation (v. 0.10):

กระติกน้ำ การเปลี่ยนเส้นทาง ( location, code=302, Response=None)

ส่งคืนออบเจ็กต์การตอบสนอง (แอปพลิเคชัน WSGI) ที่เรียกว่าจะเปลี่ยนเส้นทางไคลเอ็นต์ไปยังตำแหน่งเป้าหมาย รหัสที่รองรับคือ 301, 302, 303, 305 และ 307. 300 ไม่รองรับเพราะไม่ใช่การเปลี่ยนเส้นทางจริงและ 304 เพราะเป็นคำตอบสำหรับคำขอที่มีคำขอที่มีส่วนหัว If-Modified-Since ที่กำหนดไว้

ใหม่ในรุ่น 0.6 : ขณะนี้ตำแหน่งสามารถเป็นสตริง Unicode ที่เข้ารหัสโดยใช้ฟังก์ชัน iri_to_uri ()

พารามิเตอร์:

  • location - ตำแหน่งที่การตอบสนองควรเปลี่ยนเส้นทาง
  • code- รหัสสถานะการเปลี่ยนเส้นทาง ค่าเริ่มต้นเป็น 302
  • Response(class) - คลาส Response ที่จะใช้เมื่อสร้างการตอบกลับ ค่าเริ่มต้นคือ werkzeug.wrappers.Response ถ้าไม่ได้ระบุ

13

ฉันเชื่อว่าคำถามนี้ควรได้รับการอัปเดต: ลองมาดูวิธีการอื่น ๆ และทำการเปรียบเทียบ

นี่คือวิธีที่คุณเปลี่ยนเส้นทาง (3xx) จาก URL หนึ่งไปยัง URL อื่นใน 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)

สำหรับการอ้างอิงอย่างเป็นทางการอื่น ๆที่นี่



5

Flask มีredirectฟังก์ชั่นสำหรับเปลี่ยนเส้นทางไปยัง URL ใด ๆ ยิ่งไปกว่านั้นคุณสามารถยกเลิกการร้องขอก่อนด้วยรหัสข้อผิดพลาดด้วย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)

ตามค่าเริ่มต้นหน้าข้อผิดพลาดขาวดำจะปรากฏขึ้นสำหรับรหัสข้อผิดพลาดแต่ละรหัส

redirectวิธีการใช้เวลาไปโดยปริยายรหัส 302 รายการสำหรับ http รหัสสถานะที่นี่


1

สำหรับสิ่งนี้คุณสามารถใช้redirectฟังก์ชั่นที่รวมอยู่ในflask

from flask import Flask, redirect

app = Flask(__name__)

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

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

เคล็ดลับที่มีประโยชน์อีกประการหนึ่ง (ขณะที่คุณยังใหม่กับขวด) คือการเพิ่มapp.debug = Trueหลังจากเริ่มต้นวัตถุขวดเนื่องจากการส่งออกดีบักเกอร์ช่วยได้มากในขณะที่การค้นหาสิ่งที่ผิด


1

คุณสามารถใช้สิ่งนี้:

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)

นี่คือลิงค์อ้างอิงไปยังรหัสนี้

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.