用装饰器覆盖Django视图

And*_*dge 1 python django django-views

我的情况需要将已登录的用户从登录页面重定向到另一个页面.我已经看到提到这可以通过装饰器完成,这是有道理的,但我是相当新的使用它们.但是,我使用的是django登录和第三方视图(来自django-registration).我不想更改django.contrib.auth或django-registration中的任何代码.如何将装饰器应用于不被修改的视图以获得所需的行为.

提前致谢!

更新:我发现我错误地将登录功能与注册模块相关联.django-registration与此问题无关.但是,我仍然需要能够覆盖默认的login()行为.有什么想法吗?

kal*_*sin 6

还有三种方法,尽管你需要使用自己的urlconf:

  1. 直接在urlconf中将装饰器添加到视图中:

    ...
    (regexp, decorator(view)),
    ...
    
    Run Code Online (Sandbox Code Playgroud)

    你需要将视图和装饰器导入到urlconf中,这就是我不喜欢这个的原因.我更喜欢在urls.py中尽可能少地导入.

  2. 将视图导入<app>/views.py并在那里添加装饰器:

    import view
    
    view = decorator(view)
    
    Run Code Online (Sandbox Code Playgroud)

    很像Vinay的方法虽然更明确,因为你需要一个urlconf.

  3. 在新视图中包装视图:

    import view
    
    @decorator
    def wrapperview(request, *args, **kwargs):
        ... other stuff ...
        return view(request, *args, **kwargs)
    
    Run Code Online (Sandbox Code Playgroud)

    当您需要更改通用视图时,最后一个非常方便.这就是我经常最终做的事情.

无论何时使用urlconf,模式的顺序都很重要,因此您可能需要在首先调用哪个模式时进行随机播放.