Динамическое добавление правил URL в приложение Flask

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

2 ответов


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

возможно, это полезно:http://flask.pocoo.org/docs/patterns/appdispatch/


у меня было аналогичное требование для моего приложения, где каждая конечная точка /<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-запрос? Надеюсь, это поможет.