У меня есть приложение Flask, которое обрабатывает диапазон URL-адресов. Я разбиваю его на несколько модулей обработчиков, где обработчик зависит от первого элемента пути. Сопоставление между префиксами пути / URL и обработчиками выглядит примерно так:
- / one / ... => Handler A
- / two / ... => Handler A
- / three / ... => Обработчик B
- / four / ... => Обработчик B
Вызов заданного URL-адреса в / one /. .. дает вам что-то очень похожее (хотя и не идентичное) на один и тот же URL в / two / - отсюда и желание использовать один и тот же обработчик для обоих этих наборов URL. В то же время Handler A делает что-то очень отличное от Handler B, поэтому желание реализовать четкое разделение с отдельными модулями для каждого.
Blueprints кажутся отличным способом сделать это - и по большей части работают хорошо. Я борюсь с тем, чтобы настроить дифференцированное поведение для / one / vs / two / (и / three / vs / four /). Другими словами, предоставление обработчику фактического префикса URL.
В качестве примера обработчик A выглядит как
# handler_A.py
from flask import Blueprint
handler_A = Blueprint('handler_A', __name__)
@handler_A('/somepage', methods=['GET'])
def get_page():
return "You've reached somepage provided to you by handler A"
И обработчик B имеет аналогичную структуру (но делает что-то очень
Тогда приложение выглядит как
# app.py
from flask import Flask
from handler_A import handler_A
from handler_B import handler_B
app = Flask(__name__)
app.register_blueprint(handler_A, url_prefix='/one')
app.register_blueprint(handler_A, url_prefix='/two')
app.register_blueprint(handler_B, url_prefix='/three')
app.register_blueprint(handler_B, url_prefix='/four')
Часть, которую я не могу сделать "хорошо", это выяснение того, была ли конечная точка в обработчике A (например) вызывается с URL-адреса с префиксом / one / или / two /. Для меня это важное различие, хотя как только вызывается обработчик, информация скрывается. Я просмотрел документы, но не могу найти чистый способ сделать это.
Вот варианты, которые я думал / пытался пока:
- Захват
request.path
из обработчика и вытаскивание префикса из строки. Это просто, и это работает, но кажется неудобным. - Настройка отдельной схемы для каждого пути верхнего уровня и «слияние» потока выполнения из четырех схем в два моих обработчика
- Сделать верхний уровень URL-адреса параметром, который записывается в контексте (например, https://flask.palletsprojects.com/en/1.1.x/patterns/urlprocessors/#internationalized -blueprint-urls ). Однако я думаю, что это также требует, чтобы я написал собственный обработчик URL-адресов, если я хочу, чтобы «один» и «два» соответствовали одному
url_prefix
, а «два» и «три» соответствовали другому.
Есть ли умный способ сделать это, которого мне не хватает?