#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")