我试图需要一个角色来访问我定义为MethodView的视图。然而,我似乎不能让路由被正确命名。
如果我只是要求登录与装饰器一切工作:
activities = Blueprint("activities", __name__, url_prefix="/activities")
class ActivitiesView(MethodView):
def get():
pass
def post():
pass
view = login_required(ActivitiesView.as_view("activities"))
activities.add_url_rule('/', view_func=view)
我得到所需的路由名称,即activities.activities
:
>>> current_app.url_map
Map([...
<Rule '/activities/' (HEAD, POST, OPTIONS, GET) -> activities.activities>,
...])
然而,当我尝试使用roles_required
时,路由的名称被打乱了,POST
方法不再列出:
view = roles_required("experimenter", ActivitiesView.as_view("activities"))
activities.add_url_rule('/', view_func=view)
>>> current_app.url_map
Map([...
<Rule '/activities/' (HEAD, OPTIONS, GET) -> activities.wrapper>,
...])
将参数转换为add_url_rule
不会改变任何东西。我如何使用roles_required
而不弄乱路由名称?
这样做修复了路由名,但没有修复丢失的POST方法:
view = roles_required("experimenter", endpoint="activities", ActivitiesView.as_view("activities"))
activities.add_url_rule('/', view_func=view)
解决方案是调用装饰器:
view = roles_required("experimenter")(ActivitiesView.as_view("activities"))
activities.add_url_rule('/', view_func=view)
另外:
decorators = [roles_required("experimenter")]
感谢这篇文章:
http://scottlobdell.me/2015/04/decorators-arguments-python/