在 Flask MethodView 的派生 类 中修饰方法

Decorate methods in derived classes of Flask MethodView

我认为我可以通过如下装饰 __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 之外,如何在不对视图进行任何操作的情况下强制执行此修饰?

要装饰 MethodView 实例的方法,您必须添加一个 decorators class 变量,其中包含要调用的装饰器列表。见 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

    # ...

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