Как сопоставить отдельные наборы префиксов URL-адресов с чертежами Flask - PullRequest
0 голосов
/ 06 августа 2020

У меня есть приложение 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, а «два» и «три» соответствовали другому.

Есть ли умный способ сделать это, которого мне не хватает?

1 Ответ

1 голос
/ 06 августа 2020

Для меня requests.path - хорошее решение. Это неудобно, поскольку это неявный параметр функции; единственная разница между этим и искомым решением - это явные и неявные параметры. Я думаю, что этот метод, хотя и несовершенный, более читабелен, чем сложность, необходимая для того, чтобы сделать это явным. 1005 *

@handler_A('/somepage', methods=['GET'])
def getPage():
    return pageForPath(requests.path)

def pageForPath(path):
    return '<html> .... path ... </html>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...