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


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.