Django中间件process_view获取视图类?

时间:2014-07-09 22:46:10

标签: django middleware

我使用的是基于分类的视图,我想创建一个中间件,以便在某些条件下重定向到其他地方。

我已尝试使用process_request(),但我需要添加排除项以避免循环。

我正在尝试的是排除基本视图类的视图,但process_view()获取视图函数,请参阅documentation,好像我无法从中获取视图类,我在这里问验证这是真的还是有更好的方法?

2 个答案:

答案 0 :(得分:4)

默认情况下,确实无法获取实际的视图类。但是,您可以按如下方式覆盖as_view方法:

class ViewClassMixin(object):
    @class_method
    def as_view(cls, **initkwargs):
        view = super(ViewClassMixin, cls).as_view(**initkwargs)
        view.cls = cls
        return view

积分转到django-rest-framework,他们在view classes中使用此方法。

然后视图类可以作为实际视图函数的cls属性访问。

更新: 1.9会为Django自己的基于类的视图添加相同的行为。 View.as_view()返回的视图函数将具有view_class属性。

答案 1 :(得分:1)

有点超出我的问题范围:

我选择了像login_required

这样的装饰风格,而不是排除基本视图类的视图
def skip_user_status_sync(view_func):
    """ marks the view function to skip sync middleware """
    view_func.skip_user_status_sync = True
    return view_func
在网址中

,例如login_required

url(r'^logout/$', skip_user_status_sync(views.Logout.as_view()), name='logout'),

然后在中间件中检查该函数属性:

class UserStatusSyncMiddleware(object):
    def process_view(self, request, view_func, *view_args, **view_kwargs):
        if hasattr(view_func, 'skip_user_status_sync'):
            return None