'endpoint' ในขวดคืออะไร?


125

ขวดแสดงเอกสาร :

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

"ปลายทาง" หมายถึงอะไรกันแน่

คำตอบ:


268

วิธีการทำงานของ 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'

1
วิธีurl_forการรูท? ฉันจับข้อผิดพลาดCould not build url for endpoint ''
TomSawyer

ฉันชอบคำอธิบายของคุณมากและทำให้ฉันมีความคิดที่ดีว่าจุดสิ้นสุดเหล่านี้ทำงานอย่างไร อย่างไรก็ตามตอนนี้ฉันเข้าใจแนวคิดนี้แล้วฉันคิดว่าคุณขาดประเด็นเกี่ยวกับจุดสิ้นสุดใน Flask โดยเฉพาะ หากคุณไม่ระบุจุดสิ้นสุดกฎของคุณในurl_for()ฟังก์ชันอาจเสียหายได้โดยการเปลี่ยนชื่อของฟังก์ชัน / คลาสด้วยเหตุผล X หรือ Y (มีคนปรับรหัสใหม่และพบชื่อที่เหมาะสมกว่า ฯลฯ ... ) จุดสิ้นสุดที่สร้างขึ้นโดยอัตโนมัติโดย Flask ช่วยให้คุณจัดการกับการเปลี่ยนแปลงของ url จุดสิ้นสุดที่ชัดเจนช่วยให้คุณจัดการกับการเปลี่ยนแปลง url และการเปลี่ยนชื่อ func ของคุณ
IMCoins

1
สิ่งนี้ทำให้ความเข้าใจของฉันชัดเจนขึ้นเกี่ยวกับฟังก์ชันการทำงานของอุปกรณ์ปลายทางของ Flask และอาจเป็นคำจำกัดความของจุดสิ้นสุดโดยทั่วไป นอกจากนี้ฉันยังพบการพิมพ์ผิด ไม่ควรใช้ฟังก์ชั่น View ของคุณgive_greetingแทนmy_greeting? ไม่เห็นmy_greetingที่ไหน ..
steveohmn

23

Endpoint คือชื่อที่ใช้ในการค้นหากฎ url แบบย้อนกลับurl_forและมีค่าเริ่มต้นเป็นชื่อของฟังก์ชันมุมมอง

ตัวอย่างเล็ก ๆ :

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