Ответ 1
самый "фласковый" способ проверить, какой маршрут вызвал ваше представление, request.url_rule
.
rule = request.url_rule
if 'antitop' in rule.rule:
# request by '/antitop'
elif 'top' in rule.rule:
# request by '/top'
В Flask, когда у меня есть несколько маршрутов для одной и той же функции, как я могу узнать, какой маршрут используется в данный момент?
Например:
@app.route("/antitop/")
@app.route("/top/")
@requires_auth
def show_top():
....
Как я могу узнать, что теперь меня вызывали с помощью /top/
или /antitop/
?
UPDATE
Я знаю о request_path
Я не хочу использовать его, потому что запрос может быть довольно сложным, и я хочу повторить логику маршрутизации в функции. Я думаю, что решение с url_rule
является лучшим.
самый "фласковый" способ проверить, какой маршрут вызвал ваше представление, request.url_rule
.
rule = request.url_rule
if 'antitop' in rule.rule:
# request by '/antitop'
elif 'top' in rule.rule:
# request by '/top'
Просто используйте request.path
.
from flask import request
...
@app.route("/antitop/")
@app.route("/top/")
@requires_auth
def show_top():
... request.path ...
Другой вариант - использовать переменную конечной точки:
@app.route("/api/v1/generate_data", methods=['POST'], endpoint='v1')
@app.route("/api/v2/generate_data", methods=['POST'], endpoint='v2')
def generate_data():
version = request.endpoint
return version
Если вам нужно различное поведение для каждого маршрута, то нужно сделать два обработчика функций.
@app.route("/antitop/")
@requires_auth
def top():
...
@app.route("/top/")
@requires_auth
def anti_top():
...
В некоторых случаях ваша структура имеет смысл. Вы можете установить значения для каждого маршрута.
@app.route("/antitop/", defaults={'_route': 'antitop'})
@app.route("/top/", defaults={'_route': 'top'})
@requires_auth
def show_top(_route):
# use _route here
...
Мне кажется, что если у вас есть ситуация, когда это имеет значение, вы не должны использовать одну и ту же функцию в первую очередь. Разделите его на два отдельных обработчика, каждый из которых вызывает общую фикцию для общего кода.