【发布时间】:2014-07-09 22:46:09
【问题描述】:
我正在使用基于分类的视图,我想创建一个中间件以在某些情况下重定向到其他地方。
我尝试过使用process_request(),但我需要添加排除项以避免循环。
我正在尝试排除基本视图类的视图,但process_view() 获取视图功能,请参阅documentation,似乎我无法从中获取视图类,我在这里要求验证是否是是真的还是有更好的方法?
【问题讨论】:
标签: django middleware
我正在使用基于分类的视图,我想创建一个中间件以在某些情况下重定向到其他地方。
我尝试过使用process_request(),但我需要添加排除项以避免循环。
我正在尝试排除基本视图类的视图,但process_view() 获取视图功能,请参阅documentation,似乎我无法从中获取视图类,我在这里要求验证是否是是真的还是有更好的方法?
【问题讨论】:
标签: django middleware
默认情况下确实没有办法获取实际的视图类。但是,您可以按如下方式覆盖as_view 方法:
class ViewClassMixin(object):
@class_method
def as_view(cls, **initkwargs):
view = super(ViewClassMixin, cls).as_view(**initkwargs)
view.cls = cls
return view
感谢在view classes 中使用此方法的 django-rest-framework。
然后视图类可以作为实际视图函数上的cls 属性访问。
更新: 1.9 将相同的行为添加到 Django 自己的基于类的视图中。 View.as_view() 返回的视图函数将具有 view_class 属性。
【讨论】:
login_required这样的装饰器
有点超出我的问题范围:
我没有排除基础视图类的视图,而是选择了像 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
【讨论】: