Що таке "кінцева точка" у колбі?


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

Що саме означає "кінцева точка"?

Відповіді:


267

Як працює 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-адреси нашої програми, не змінюючи рядок, де ми посилаємося на цей ресурс.

Чому б не завжди використовувати назву функції перегляду?

Одне запитання, яке може виникнути, наступне: "Навіщо нам потрібен цей додатковий шар?" Чому відображення шляху до кінцевої точки, а потім кінцевої точки до функції перегляду? Чому б просто не пропустити цей середній крок?

Причина в тому, що вона є більш потужною. Наприклад, Флашмарові креслення дозволяють розділити додаток на різні частини. У мене можуть бути всі мої ресурси адміністратора в кресленні під назвою "адміністратор", а всі мої ресурси на рівні користувача в кінцевій точці, що називається "користувач".

Креслення дозволяють розділити їх на простори імен. Наприклад...

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
Hows about url_forfor root? Я Could not build url for endpoint ''
зрозумів

Мені дуже сподобалося ваше пояснення, і це дало мені гарне уявлення про те, як працюють ці кінцеві точки. Однак тепер, коли я розумію цю концепцію, я думаю, що ви пропускаєте пункт щодо кінцевих точок, зокрема на колбі. Якщо не вказати кінцеві точки, ваше правило у url_for()функції може бути порушено зміною назви функції / класу з причин X або Y (хтось переробив код і знайшов більш відповідне ім’я тощо ...). Автоматично створені Flask кінцеві точки допомагають впоратися зі змінами URL-адреси. Явна кінцева точка допомагає вам боротися зі змінами URL-адреси та змінами імен вашого функціоналу.
IMCoins

1
Це дійсно очищує моє розуміння функціональності кінцевої точки Фласка і, можливо, навіть визначення кінцевої точки загалом. Також я знайшов певний помилок. Чи не повинна give_greetingзамість вашої функції «Перегляд» бути my_greeting? Я my_greetingніде не бачу ..
steveohmn

23

Кінцева точка - це ім'я, яке використовується для зворотного пошуку правил 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')
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.