'Điểm cuối' trong Flask là gì?


124

Các Flask chương trình tài liệu :

add_url_rule(*args, **kwargs)
      Connects a URL rule. Works exactly like the route() decorator.
      If a view_func is provided it will be registered with the endpoint.

     endpoint  the endpoint for the registered URL rule. Flask itself assumes the name of the view function as endpoint

Chính xác thì "điểm cuối" nghĩa là gì?

Câu trả lời:


267

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_greetinghà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'

1
Hows về url_forroot? Tôi đã bắt lỗiCould not build url for endpoint ''
TomSawyer

Tôi thực sự thích lời giải thích của bạn, và nó đã cho tôi một ý tưởng hay về cách các điểm cuối này hoạt động. Tuy nhiên, bây giờ tôi đã hiểu khái niệm này, tôi nghĩ rằng bạn đang thiếu một điểm liên quan đến các điểm cuối, cụ thể là trong Flask. Nếu bạn không chỉ định điểm cuối, quy tắc của bạn trong url_for()hàm có thể bị phá vỡ bằng cách thay đổi tên của hàm / lớp vì lý do X hoặc Y (ai đó đã cấu trúc lại mã và tìm thấy tên phù hợp hơn, v.v.). Các điểm cuối được tạo tự động bởi Flask giúp bạn xử lý các thay đổi của url. Điểm cuối rõ ràng giúp bạn xử lý các thay đổi url và thay đổi tên của func của bạn.
IMCoin

1
Điều này thực sự làm rõ sự hiểu biết của tôi về chức năng điểm cuối của Flask và thậm chí có thể nói chung là định nghĩa của điểm cuối. Ngoài ra tôi tìm thấy một số lỗi đánh máy. Không nên give_greetingthay thế chức năng Xem của bạn my_greeting? Tôi không thấy ở my_greetingđâu cả ..
steveohmn

23

Điểm cuối là tên được sử dụng để tra cứu ngược lại các quy tắc url url_forvà nó mặc định là tên của chức năng xem.

Ví dụ nhỏ:

from flask import Flask, url_for

app = Flask(__name__)

# We can use url_for('foo_view') for reverse-lookups in templates or view functions
@app.route('/foo')
def foo_view():
    pass

# We now specify the custom endpoint named 'bufar'. url_for('bar_view') will fail!
@app.route('/bar', endpoint='bufar')
def bar_view():
    pass

with app.test_request_context('/'):
    print url_for('foo_view')
    print url_for('bufar')
    # url_for('bar_view') will raise werkzeug.routing.BuildError
    print url_for('bar_view')
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.