Динамически добавлять правила URL в приложение Flask - PullRequest
9 голосов
/ 09 ноября 2011

Я пишу приложение, в котором пользователи смогут хранить информацию, для которой они могут указать интерфейс REST. IE, храните список продуктов на /<username>/rest/products. Поскольку URL-адреса, очевидно, неизвестны заранее, я пытался придумать лучший способ реализации динамического создания URL-адресов во Flask. Первый способ, о котором я подумал, - написать правило для всех и направить оттуда URL. Но тогда я в основном дублирую возможности маршрутизации URL, когда во Flask они уже встроены. Итак, мне было интересно, будет ли плохой идеей использовать .add_url_rule() ( документы здесь , прокрутите немного вниз), чтобы прикрепить их непосредственно к приложению. Есть ли конкретная причина, по которой этого не следует делать?

Ответы [ 2 ]

12 голосов
/ 09 ноября 2011

Каждый раз, когда вы выполняете add_url_rule(), внутренняя маршрутизация переопределяет карту URL. Это не потокобезопасно и не быстро. Я прямо сейчас не понимаю, зачем вам нужны специфичные для пользователя правила URL, если честно. Похоже, вы действительно хотите, чтобы пользовательские приложения были смонтированы?

Может быть, это полезно: http://flask.pocoo.org/docs/patterns/appdispatch/

0 голосов
/ 07 апреля 2017

У меня было аналогичное требование для моего приложения, где каждая конечная точка /<SOMEID>/rest/other для данного SOMEID должна быть связана с другой функцией.Одним из способов достижения этого является ведение поискового словаря, в котором значения являются функцией, которая обрабатывает определенный SOMEID.Например, взгляните на этот фрагмент:

func_look_up_dict = {...}
@app.route('<SOMEID>/rest/other', methods=['GET'])
def multiple_func_router_endpoint(SOMEID):
    if SOMEID in func_look_up_dict.keys():
        return jsonify({'result' = func_look_up_dict[SOMEID]()}), 200
    else:
        return jsonify({'result'='unknown', 'reason'='invalid id in url'}), 404

, поэтому для этого вам не нужно «динамически» добавлять правила URL, а вместо этого использовать правило URL с параметром и обрабатывать различные случаи сединственная функция.Еще одна вещь, которую стоит рассмотреть, - это подумать над вариантом использования такой конечной точки URL.Если <username> - это параметр, который необходимо передать, почему бы не использовать правило URL, например /rest/product/<username>, или передать его в качестве аргумента в запросе GET?Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...