Cách thức hoạt động của Flask Routing
Toàn bộ ý tưởng của Flask (và thư viện Werkzeug bên dưới) là ánh xạ các đường dẫn URL tới một số logic mà bạn sẽ chạy (thông thường, "chức năng xem"). Chế độ xem cơ bản của bạn được xác định như thế này:
@app.route('/greeting/<name>')
def give_greeting(name):
return 'Hello, {0}!'.format(name)
Lưu ý rằng hàm bạn đã đề cập (add_url_rule) đạt được cùng một mục tiêu, chỉ cần không sử dụng ký hiệu trang trí. Do đó, như sau:
# 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)
Giả sử trang web của bạn được đặt tại 'www.example.org' và sử dụng chế độ xem ở trên. Người dùng nhập URL sau vào trình duyệt của họ:
http://www.example.org/greeting/Mark
Công việc của Flask là lấy URL này, tìm ra những gì người dùng muốn làm và chuyển nó đến một trong nhiều chức năng python của bạn để xử lý. Nó đi theo con đường :
/greeting/Mark
... Và khớp nó với danh sách các tuyến đường. Trong trường hợp của chúng tôi, chúng tôi đã xác định đường dẫn này để đi đến give_greeting
hàm.
Tuy nhiên, mặc dù đây là cách điển hình mà bạn có thể tạo ra một chế độ xem, nhưng nó thực sự trừu tượng hóa một số thông tin bổ sung từ bạn. Đằng sau hậu trường, Flask đã không thực hiện bước nhảy vọt trực tiếp từ URL sang chức năng xem nên xử lý yêu cầu này. Nó không chỉ đơn giản nói ...
URL (http://www.example.org/greeting/Mark) should be handled by View Function (the function "give_greeting")
Trên thực tế, có một bước khác, nơi nó ánh xạ URL tới điểm cuối:
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"
Về cơ bản, "điểm cuối" là một mã định danh được sử dụng để xác định đơn vị logic nào trong mã của bạn sẽ xử lý yêu cầu . Thông thường, một điểm cuối chỉ là tên của một chức năng xem. Tuy nhiên, bạn thực sự có thể thay đổi điểm cuối, như được thực hiện trong ví dụ sau.
@app.route('/greeting/<name>', endpoint='say_hello')
def give_greeting(name):
return 'Hello, {0}!'.format(name)
Bây giờ, khi Flask định tuyến yêu cầu, logic trông như thế này:
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"
Cách bạn sử dụng Điểm cuối
Điểm cuối thường được sử dụng cho "tra cứu ngược". Ví dụ: trong một chế độ xem ứng dụng Flask của bạn, bạn muốn tham chiếu một chế độ xem khác (có lẽ khi bạn đang liên kết từ một khu vực của trang web sang một khu vực khác). Thay vì mã cứng URL, bạn có thể sử dụng url_for()
. Giả sử như sau
@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)
Điều này là thuận lợi, vì bây giờ chúng tôi có thể thay đổi URL của ứng dụng của mình mà không cần thay đổi dòng nơi chúng tôi tham chiếu tài nguyên đó.
Tại sao không chỉ luôn luôn sử dụng tên của chức năng xem?
Một câu hỏi có thể xuất hiện là: "Tại sao chúng ta cần lớp bổ sung này?" Tại sao ánh xạ đường dẫn đến điểm cuối, rồi điểm cuối đến chức năng xem? Tại sao không bỏ qua bước giữa?
Lý do là bởi vì nó mạnh hơn theo cách này. Ví dụ, Flask Blueprints cho phép bạn chia ứng dụng của mình thành nhiều phần khác nhau. Tôi có thể có tất cả các tài nguyên phía quản trị viên của mình trong một kế hoạch chi tiết được gọi là "quản trị viên" và tất cả các tài nguyên ở cấp độ người dùng của tôi trong một điểm cuối được gọi là "người dùng".
Bản thiết kế cho phép bạn tách chúng thành các không gian tên. Ví dụ...
chính:
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')
quản trị viên:
admin = Blueprint('admin', __name__)
@admin.route('/greeting')
def greeting():
return 'Hello, administrative user!'
người dùng:
user = Blueprint('user', __name__)
@user.route('/greeting')
def greeting():
return 'Hello, lowly normal user!'
Lưu ý rằng trong cả hai bản thiết kế, tuyến đường '/ lời chào' là một chức năng gọi là "lời chào". Nếu tôi muốn đề cập đến chức năng "chào" của quản trị viên, tôi không thể chỉ nói "chào" vì còn có chức năng "chào" của người dùng. Điểm cuối cho phép sắp xếp không gian tên bằng cách bạn chỉ định tên của bản thiết kế như một phần của điểm cuối. Vì vậy, tôi có thể làm như sau ...
print url_for('admin.greeting') # Prints '/admin/greeting'
print url_for('user.greeting') # Prints '/user/greeting'
url_for
root? Tôi đã bắt lỗiCould not build url for endpoint ''