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