วิธีการทำงานของ Flask Routing
แนวคิดทั้งหมดของ Flask (และไลบรารี Werkzeug) คือการแมปเส้นทาง URL กับตรรกะบางอย่างที่คุณจะเรียกใช้ (โดยทั่วไปคือ "ฟังก์ชันมุมมอง") มุมมองพื้นฐานของคุณถูกกำหนดไว้เช่นนี้:
@app.route('/greeting/<name>')
def give_greeting(name):
return 'Hello, {0}!'.format(name)
โปรดทราบว่าฟังก์ชันที่คุณอ้างถึง (add_url_rule) บรรลุเป้าหมายเดียวกันโดยไม่ต้องใช้สัญกรณ์มัณฑนากร ดังนั้นสิ่งต่อไปนี้จึงเหมือนกัน:
# No "route" decorator here. We will add routing using a different method below.
def give_greeting(name):
return 'Hello, {0}!'.format(name)
app.add_url_rule('/greeting/<name>', 'give_greeting', give_greeting)
สมมติว่าเว็บไซต์ของคุณอยู่ที่ "www.example.org" และใช้มุมมองด้านบน ผู้ใช้ป้อน URL ต่อไปนี้ลงในเบราว์เซอร์:
http://www.example.org/greeting/Mark
หน้าที่ของ Flask คือใช้ URL นี้ค้นหาว่าผู้ใช้ต้องการทำอะไรและส่งต่อไปยังฟังก์ชัน python หลายตัวของคุณเพื่อจัดการ ใช้เส้นทาง :
/greeting/Mark
... และจับคู่กับรายการเส้นทาง ในกรณีของเราเรากำหนดเส้นทางนี้เพื่อไปที่give_greeting
ฟังก์ชัน
อย่างไรก็ตามแม้ว่านี่จะเป็นวิธีการทั่วไปที่คุณอาจใช้ในการสร้างมุมมอง แต่จริงๆแล้วข้อมูลเพิ่มเติมบางส่วนจะเป็นนามธรรมจากคุณ เบื้องหลัง Flask ไม่ได้ก้าวกระโดดโดยตรงจาก URL ไปยังฟังก์ชันมุมมองที่ควรจัดการคำขอนี้ ไม่เพียงพูดว่า ...
URL (http://www.example.org/greeting/Mark) should be handled by View Function (the function "give_greeting")
จริงๆแล้วยังมีอีกขั้นตอนหนึ่งที่จะจับคู่ URL กับปลายทาง:
URL (http://www.example.org/greeting/Mark) should be handled by Endpoint "give_greeting".
Requests to Endpoint "give_greeting" should be handled by View Function "give_greeting"
โดยพื้นฐานแล้ว"ปลายทาง" คือตัวระบุที่ใช้ในการพิจารณาว่าหน่วยตรรกะของรหัสของคุณควรจัดการกับคำขอใด โดยปกติจุดสิ้นสุดเป็นเพียงชื่อของฟังก์ชันมุมมอง อย่างไรก็ตามคุณสามารถเปลี่ยนจุดสิ้นสุดได้ดังที่ทำในตัวอย่างต่อไปนี้
@app.route('/greeting/<name>', endpoint='say_hello')
def give_greeting(name):
return 'Hello, {0}!'.format(name)
ตอนนี้เมื่อ Flask กำหนดเส้นทางคำขอตรรกะจะมีลักษณะดังนี้:
URL (http://www.example.org/greeting/Mark) should be handled by Endpoint "say_hello".
Endpoint "say_hello" should be handled by View Function "give_greeting"
คุณใช้ปลายทางอย่างไร
จุดสิ้นสุดมักใช้สำหรับ "การค้นหาแบบย้อนกลับ" ตัวอย่างเช่นในมุมมองหนึ่งของแอปพลิเคชัน Flask ของคุณคุณต้องการอ้างอิงมุมมองอื่น (บางทีเมื่อคุณเชื่อมโยงจากพื้นที่หนึ่งไปยังอีกที่หนึ่ง) แทนที่จะยากรหัส URL url_for()
คุณสามารถใช้ สมมติต่อไปนี้
@app.route('/')
def index():
print url_for('give_greeting', name='Mark') # This will print '/greeting/Mark'
@app.route('/greeting/<name>')
def give_greeting(name):
return 'Hello, {0}!'.format(name)
นี่เป็นข้อดีเนื่องจากตอนนี้เราสามารถเปลี่ยน URL ของแอปพลิเคชันของเราได้โดยไม่จำเป็นต้องเปลี่ยนบรรทัดที่เราอ้างอิงทรัพยากรนั้น
ทำไมไม่ใช้ชื่อของฟังก์ชันมุมมองเสมอไป
คำถามหนึ่งที่อาจเกิดขึ้นมีดังต่อไปนี้: "ทำไมเราถึงต้องการเลเยอร์พิเศษนี้" เหตุใดจึงต้องแมปพา ธ ไปยังจุดสิ้นสุดแล้วจุดสิ้นสุดไปยังฟังก์ชันมุมมอง ทำไมไม่ข้ามขั้นตอนกลางนั้นไป
เหตุผลก็เพราะว่ามันมีพลังมากกว่าด้วยวิธีนี้ ตัวอย่างเช่นFlask Blueprintsช่วยให้คุณสามารถแยกแอปพลิเคชันของคุณออกเป็นส่วนต่างๆ ฉันอาจมีทรัพยากรฝั่งผู้ดูแลระบบทั้งหมดในพิมพ์เขียวชื่อ "ผู้ดูแลระบบ" และทรัพยากรระดับผู้ใช้ทั้งหมดของฉันในปลายทางที่เรียกว่า "ผู้ใช้"
พิมพ์เขียวช่วยให้คุณแยกสิ่งเหล่านี้ออกเป็นเนมสเปซ ตัวอย่างเช่น...
main.py:
from flask import Flask, Blueprint
from admin import admin
from user import user
app = Flask(__name__)
app.register_blueprint(admin, url_prefix='admin')
app.register_blueprint(user, url_prefix='user')
admin.py:
admin = Blueprint('admin', __name__)
@admin.route('/greeting')
def greeting():
return 'Hello, administrative user!'
user.py:
user = Blueprint('user', __name__)
@user.route('/greeting')
def greeting():
return 'Hello, lowly normal user!'
โปรดทราบว่าในพิมพ์เขียวทั้งสองเส้นทาง "/ ทักทาย" เป็นฟังก์ชันที่เรียกว่า "คำทักทาย" ถ้าฉันต้องการอ้างถึงฟังก์ชัน "คำทักทาย" ของผู้ดูแลระบบฉันไม่สามารถพูดคำว่า "ทักทาย" ได้เพราะยังมีฟังก์ชัน "ทักทาย" ของผู้ใช้ด้วย จุดสิ้นสุดอนุญาตให้มีการจัดเรียงเนมสเปซโดยให้คุณระบุชื่อของพิมพ์เขียวเป็นส่วนหนึ่งของปลายทาง ฉันสามารถทำสิ่งต่อไปนี้ได้ ...
print url_for('admin.greeting') # Prints '/admin/greeting'
print url_for('user.greeting') # Prints '/user/greeting'
url_for
การรูท? ฉันจับข้อผิดพลาดCould not build url for endpoint ''