繁体   English   中英

用装饰器覆盖Django视图

[英]Overriding Django views with decorators

我遇到一种情况,需要将已经登录的用户从登录页面重定向到另一个页面。 我已经看到提到可以使用有意义的装饰器来完成此操作,但是我对使用它们是相当陌生的。 但是,我正在使用django登录名和第三方视图(来自django-registration)。 我不想更改django.contrib.auth或django-registration中的任何代码。 如何将装饰器应用于未经修改的视图,以获取所需的行为。

提前致谢!

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

还有另外三种方法,尽管您需要为此使用自己的urlconf:

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

     ... (regexp, decorator(view)), ... 

    您需要将视图和装饰器导入urlconf中,这就是为什么我不喜欢这一视图。 我希望urls.py中的导入尽可能少。

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

     import view view = decorator(view) 

    尽管您需要一个urlconf,但是它更像Vinay的方法,但更明确。

  3. 将视图换成新视图:

     import view @decorator def wrapperview(request, *args, **kwargs): ... other stuff ... return view(request, *args, **kwargs) 

    当您需要更改通用视图时,最后一个非常方便。 无论如何,这就是我经常要做的。

每当使用urlconf时,模式的顺序都很重要,因此您可能需要重新安排首先调用哪种模式。

如果您具有装饰器功能,并且知道要在django-registration中装饰哪个视图,则可以

registration.view_func = decorator_func(registration.view_func)

其中registration是django-registration中的模块,其中包含要装饰的视图函数, view_func 要装饰的视图函数,而decorator_func是装饰器。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM