zoukankan      html  css  js  c++  java
  • Django学习笔记第八篇--实战练习四--为你的视图函数自定义装饰器

    零、背景:

    对于登录后面所有视图函数,都需要验证登录信息,一般而言就是验证cookie里面的一些信息。所以你可以这么写函数:

    1 def personinfo(request):
    2     if request.COOKIES.get("login_flag") == "1":
    3         return HttpResponse("Success!")
    4     else:
    5         return HttpResponse("Failed!")

    这样就可以验证登录与否然后对应返回了。但是有没有觉得每个视图函数都这么写,类似了。那么我们可以自定义装饰器。

    一、装饰器的写法:

    logincheck/logincheck.py

     1 from django.http import HttpResponseRedirect
     2 def login_need(func):
     3     def in_func(request):
     4         if request.COOKIES.get("login_name") not in ["",None," "]:
     5             if request.COOKIES.get("login_flag") == "1":
     6                 return func(request)
     7             else:
     8                 print request.COOKIES
     9                 return HttpResponseRedirect("/myapp1/login")
    10         else:
    11             print request.COOKIES
    12             return HttpResponseRedirect("/myapp1/login")
    13     return in_func

    然后在myapp1/views.py中使用

    1 @logincheck.login_need
    2 def main(request):
    3     return render(request,"welcome.html")

    就可以了,后面的视图都是这么写会省很多事情。

    二、突然发现我这个视图这么写,会导致一个问题越权:

    [01/Feb/2018 17:08:54]"GET /myapp1/mainpage?name=chenran HTTP/1.1" 301 0
    [01/Feb/2018 17:08:54]"GET /myapp1/mainpage/?name=chenran HTTP/1.1" 200 130
    [01/Feb/2018 17:09:06]"GET /myapp1/mainpage/?name=chenran01 HTTP/1.1" 200 130
    [01/Feb/2018 17:09:13]"GET /myapp1/mainpage/?name=chenranxss HTTP/1.1" 200 130

    可想而知,我登录的时候都是一个账号,我返回的信息是确实跟随着那么参数走的,这样是有问题的。

    视图函数应该这么写才对:

    1 @logincheck.login_need
    2 def main(request):
    3     if request.COOKIES["login_name"] == request.GET["name"]:
    4         return render(request,"welcome.html")
    5     else:
    6         return render(request,"error.html")

    这次没想到自己还写了个越权,真的是一步不小心都不行。

  • 相关阅读:
    Linux系统安装IonCube的方法详解教程
    CentOS7 安装 odoo10
    关于WPF的弹出窗口
    WPF命令使用
    WPF访问UserControl的自定义属性和事件
    一步步实现 Prism + MEF(二)--- 绑定命令
    一步步实现 Prism + MEF(一)--- 搭建框架
    MVVM里绑定TreeView控件的SelectedItem
    MAF框架的使用限制
    排序--归并排序算法
  • 原文地址:https://www.cnblogs.com/KevinGeorge/p/8402462.html
Copyright © 2011-2022 走看看