Для чего используется параметр «endpoint» для @app.route()?

#python #flask

#python #flask

Вопрос:

В Flask вы создаете маршруты, подобные этому:

 from flask import Flask

app = Flask(__name__)

@app.route("/foobar")
def foo_bar_endpoint():
    ...
  

Но у декоратора маршрута также есть endpoint параметр. В документации просто указано:

конечная точка для зарегистрированного правила URL. Сама Flask принимает имя функции просмотра в качестве конечной точки

Почему нельзя просто назвать функцию в качестве конечной точки, которая должна быть вызвана? Имеет ли это отношение к чему-либо еще, кроме url_for ?

Комментарии:

1. Если вы имеете @app.route('/foobar') в виду, то это URL-адрес, который будет отображаться в URL-адресе вашего сайта, если вы имеете в виду функцию под ним, именно так flask выполняет перенаправление и загрузку, определяя функцию, чтобы знать, что Flask должен делать при вызове URL

Ответ №1:

«Endpoint» — это произвольное имя, которое вы предоставляете, которое в основном является канонической вещью, на которую ссылается маршрут. На самом деле вы не сопоставляете URL-адрес с функцией, вы сопоставляете URL-адрес с конечной точкой и подключаете функцию просмотра к этой конечной точке.

 URL → endpoint → function
  

Вы просто делаете все это за одно действие, и имя функции автоматически становится именем конечной точки в процессе. Но вы могли бы сделать все это отдельно и зарегистрировать конечную точку для URL, а затем присоединить функцию к этой конечной точке:

В основном этот пример:

 @app.route('/')
def index():
    pass
  

Эквивалентно следующему:

 def index():
    pass
app.add_url_rule('/', 'index', index)
  

Если параметр view_func не указан, вам нужно будет подключить конечную точку к функции просмотра следующим образом:

 app.view_functions['index'] = index
  

https://flask.palletsprojects.com/en/1.1.x/api/#flask .Flask.add_url_rule

Вы можете захотеть назвать свою конечную точку независимо от вашей функции, если у вас есть некоторые ограничения на имя функции, но вы уже ссылаетесь на конечную точку из другого места, особенно во время рефакторинга, в качестве одного из возможных примеров, когда это может стать актуальным.

Ответ №2:

Предназначен URL для внешних клиентов, для HTTP-запросов.

Предназначен endpoint для внутреннего использования, если вам нужно знать, какой URL перенаправлять, например, без какого-либо жесткого кодирования.

В случае, если вы не определяете конечную точку, ваш код выглядит так:

 blueprint = Blueprint("bp_1", __name__)


@blueprint.route("/foobar")
def foo_bar_endpoint():
    ...


url = flask.url_for("bp_1.foo_bar_endpoint")
  

В случае определения конечной точки вы используете функцию url_for с ее именем:

 @blueprint.route("/foobar", endpoint="custom_name")
def foo_bar_endpoint():
    ...


url = flask.url_for("bp_1. custom_name")