【问题标题】:Django middleware process_view get view class?Django 中间件 process_view 获取视图类?
【发布时间】:2014-07-09 22:46:09
【问题描述】:

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

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

我正在尝试排除基本视图类的视图,但process_view() 获取视图功能,请参阅documentation,似乎我无法从中获取视图类,我在这里要求验证是否是是真的还是有更好的方法?

【问题讨论】:

    标签: django middleware


    【解决方案1】:

    默认情况下确实没有办法获取实际的视图类。但是,您可以按如下方式覆盖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这样的装饰器
    【解决方案2】:

    有点超出我的问题范围:

    我没有排除基础视图类的视图,而是选择了像 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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-07-28
      • 1970-01-01
      • 1970-01-01
      • 2013-03-23
      相关资源
      最近更新 更多