用装饰器覆盖Django视图

2024-04-20 11:07:12 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个情况,需要将已经登录的用户从登录页面重定向到另一个页面。我看到有人提到,这可以通过装饰工来完成,这是有意义的,但我对使用它们还是相当陌生的。但是,我使用的是django登录名和第三方视图(来自django注册)。我不想在中更改任何代码django.contrib.auth公司或者django注册。如何将decorator应用于不需要修改的视图以获得所需的行为。在

提前谢谢!在

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


Tags: django代码用户auth视图情况公司装饰
2条回答

如果你有decorator函数,并且你知道你想要装饰django注册中的哪个视图,你可以这样做

registration.view_func = decorator_func(registration.view_func)

其中registration是django注册中的模块,它包含要修饰的视图函数,view_func是要修饰的视图函数,decorator_func是装饰器。在

还有三种方法可以做到这一点,但您需要使用自己的urlconf来完成这些操作:

  1. 直接在urlconf中将decorator添加到视图中:

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

    不过,您需要将视图和decorator导入urlconf,这就是我不喜欢这个的原因。我宁愿在我的网址.py尽可能的。

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

    ^{pr2}$

    非常像Vinay的方法,但更显式,因为需要一个urlconf。

  3. 在新视图中换行视图:

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

    当您需要更改通用视图时,最后一个非常方便。不管怎样,这就是我经常做的。

无论何时使用urlconf,模式的顺序都很重要,所以您可能需要重新考虑哪个模式首先被调用。在

相关问题 更多 >