使用装饰器覆盖 Django 视图
-
22-07-2019 - |
题
我遇到一种情况,需要将已登录的用户从登录页面重定向到另一个页面。我看到有人提到这可以通过装饰器来完成,这是有道理的,但我对使用它们还很陌生。但是,我使用 django 登录和第三方视图(来自 django-registration)。我不想更改 django.contrib.auth 或 django-registration 中的任何代码。如何将装饰器应用于不需要修改的视图以获得所需的行为。
提前致谢!
更新:我发现我错误地将登录功能与注册模块关联起来。django-registration 与此问题无关。但是,我仍然需要能够覆盖默认的 login() 行为。有什么想法吗?
解决方案
还有三种方法可以做到这一点,尽管您需要使用自己的 urlconf:
直接在 urlconf 中将装饰器添加到视图中:
... (regexp, decorator(view)), ...
不过,您需要将视图和装饰器导入到 urlconf 中,这就是我不喜欢这个的原因。我希望 urls.py 中的导入尽可能少。
将视图导入到
<app>/views.py
并在那里添加装饰器:import view view = decorator(view)
与 Vinay 的方法非常相似,但更明确,因为您需要一个 urlconf。
将视图包装在新视图中:
import view @decorator def wrapperview(request, *args, **kwargs): ... other stuff ... return view(request, *args, **kwargs)
当您需要更改通用视图时,最后一个非常方便。无论如何,这就是我经常做的事情。
每当您使用 urlconf 时,模式的顺序都很重要,因此您可能需要调整首先调用哪个模式。
其他提示
如果您有装饰功能,你知道哪些浏览Django中注册,你想装饰,你可以只是做
registration.view_func = decorator_func(registration.view_func)
其中registration
是在Django登记其包含要装饰视图功能模块,view_func
是要装饰,和decorator_func
是装饰视图函数。
不隶属于 StackOverflow