flask-security roles_required with pluggable views



我试图需要一个角色来访问我定义为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/

最新更新