【问题标题】:Decorate methods in derived classes of Flask MethodView装饰Flask MethodView派生类中的方法
【发布时间】:2015-09-30 04:42:05
【问题描述】:

我认为我可以通过如下装饰__enter__ 来要求所有派生视图的登录:

from flask.views import MethodView
from flask.ext.login import login_required
class LoggedInView(MethodView):
    @login_required
    def __enter__(self):
        pass

如果我添加一些日志记录,结果是__enter__ 没有输入。同样,__exit__ 也不会发生。

这是怎么回事?

我可以修改样式来装饰一些其他功能,但是必须在派生视图中调用super(),这违背了开始这样做的意义。

除了继承 LoggedInView 之外,我如何在不做任何工作的情况下强制执行此修饰?

【问题讨论】:

  • 您希望如何调用__enter__
  • @KlausD。调用任何方法时,例如 class Foo(LoggedInView): def get(self): pass
  • 不,__enter__with 构造中使用对象时会被调用。有关详细信息,请参阅 PEP 343。
  • @KlausD。哎呀。我认为它也像我描述的推论那样起作用,但我刚刚测试过,你当然是对的。不知道我做了什么,然后它在 GAE 中工作 - 我可以像这样使用其他一些“预方法挂钩”方法吗?
  • GAE 上可能有一个特殊的包装器。我可以想象这样的东西在某些情况下很有用。

标签: python flask flask-login


【解决方案1】:

要装饰MethodView 实例的方法,您必须添加一个带有要调用的装饰器列表的decorators 类变量。请参阅documentation

对于您的示例,它将是:

from flask.views import MethodView
from flask.ext.login import login_required

class LoggedInView(MethodView):
    decorators = [login_required]

    def get(self):
        pass

    def post(self):
        pass

    # ...

请注意,装饰器适用于所有定义的方法。

【讨论】:

    猜你喜欢
    • 2012-12-24
    • 2020-03-07
    • 2019-05-02
    • 1970-01-01
    • 2020-05-06
    • 2020-02-29
    • 2019-07-23
    • 2014-01-14
    • 2011-05-28
    相关资源
    最近更新 更多