Django中装饰器在函数视图以及类视图中的简单使用

2020年4月10日 21:33 阅读 1.92k 评论 0

今天在将站内消息开发完毕之后,我发现一件很蛋疼的事,那就是发送站内信之后,用户那边不能及时刷新,除非用户主动点进站内信页面才可以看到消息,这样无非是很不友好的。

当然,我可以选择在每个视图函数都主动刷新一遍用户信息,但是这样的话既不利于代码的维护,更造成了大量代码耦合,那应该怎么做呢?

使用装饰器

之前在使用Flask开发中,我就使用了装饰器,所以这次也是轻车熟路。

我先给出一个装饰器的模板,我们的装饰器都可以以这个模板为基础去拓展

def mydecorator(func): 
    def wrapper(*args,**kwargs): 
        return func(*args,**kwargs)  
    return wrapper 

那么装饰器要怎么去使用呢?

以检测用户是否登录为例

def is_login(func): 
    def wrapper(request,*args,**kwargs): 
    # 若检测不到用户就跳转登录页面 
        if not request.session.get("user"): 
            return redirect(reverse('login')) 
        return  func(request,*args, **kwargs) 
    return wrapper 

@is_login 
def myinfor(request): 
    user = User.objects.all() 
    return render(request, "myinfor.html", {"user": user}) 

这样,如果检测到用户未登录就会跳转到登录页面,我们可以用它装饰任何函数视图,注意只是函数,如果是类视图的话是不行的

在类视图中,我们需要使用如下方法去引用装饰器

from django.utils.decorators import method_decorator 

# dispatch 代表装饰所有请求类型,如果想单独只装饰某个请求如get,我们可以将其改为get 
@method_decorator(is_login, name='dispatch') 
class IndexView(generic.ListView) 
  ... 

以上就是Django中装饰器在函数视图以及类视图中的简单使用

最后修改于2020年4月10日 21:33
©允许规范转载

版权声明:如无特殊说明,文章均为本站原创,转载请注明出处

本文链接:https://www.yangyingqi.com/36.html

Django Python
微信
支付宝
登录后即可进行评论/回复