我使用的是基于分类的视图,我想创建一个中间件,以便在某些条件下重定向到其他地方。
我已尝试使用process_request()
,但我需要添加排除项以避免循环。
我正在尝试的是排除基本视图类的视图,但process_view()
获取视图函数,请参阅documentation,好像我无法从中获取视图类,我在这里问验证这是真的还是有更好的方法?
答案 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