django-视图CBV模式、CBV结合装饰器、csrf

版权声明:所有非原创内容来自网络,如有侵权联系我删除 https://blog.csdn.net/weixin_43063753/article/details/85317109
  • 使用cbv实现视图
  • CBV结合装饰器
  • CSRF Token
  • 使用cbv实现视图

    from django.views import View
    from django.utils.decorators import method_decorator
    
    
    class LoginView(View):
    
        def get(self, request):
            return render(request, "login.html")
    
        def post(self, request):
            user = request.POST.get("name")
            pwd = request.POST.get("pwd")
            if user == "safly" and pwd == "123":
                # 登陆成功
                # 写session
                request.session["user2"] = user
                request.session.set_expiry(5)
                return redirect("/index/")
    
    def index(request):
        return render(request,"index.html")
      
      
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21

    CBV结合装饰器

    直接加在视图类上,但method_decorator必须传 name 关键字参数

    from django.views import View
    from django.utils.decorators import method_decorator
    
    
    def wrapper(func):
        @wraps(func)
        def inner(request, *args, **kwargs):
            # 登录校验
            cookie_k = request.session.get("user01", None)
            if cookie_k:
                # 表示已经登录的用户
                ret = func(request, *args, **kwargs)
                return ret
            else:
                # 滚去登录
                return redirect("/login/")
    
        return inner
    
    
    class LoginView(View):
    
        def get(self, request):
            return render(request, "login.html")
    
        def post(self, request):
            user = request.POST.get("name")
            pwd = request.POST.get("pwd")
            if user == "safly" and pwd == "123":
                # 登陆成功
                # 写session
                request.session["user01"] = user
                # request.session.set_expiry(5)
                return redirect("/index/")
    
    
    @method_decorator(wrapper, name="get")
    class IndexView(View):
        def get(self, request):
            user = request.session.get("user01", "游客")
            return render(request, "index.html", {"user": user})
      
      
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41

    * 加在CBV视图的get或post方法上*

    # @method_decorator(wrapper, name="get")
    class IndexView(View):
        @method_decorator(wrapper)
        def get(self, request):
            user = request.session.get("user02", "游客")
            return render(request, "index.html", {"user": user})
    
      
      
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    * 加在dispatch方法上*

    # @method_decorator(wrapper, name="get")
    class IndexView(View):
        ## 这么写所有的请求方法都要做登录校验
        @method_decorator(wrapper)
        def dispatch(self, request, *args, **kwargs):
            return super(IndexView,self).dispatch(request,*args,**kwargs)
    
        # @method_decorator(wrapper)
        def get(self, request):
            user = request.session.get("user04", "游客")
            return render(request, "index.html", {"user": user})
    
      
      
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    CSRF Token

    CSRF Token相关装饰器在CBV只能加到dispatch方法上

    备注:

    csrf_protect,为当前函数强制设置防跨站请求伪造功能,即便settings中没有设置全局中间件。
    csrf_exempt,取消当前函数防跨站请求伪造功能,即便settings中设置了全局中间件
    
      
      
    • 1
    • 2
    from django.views.decorators.csrf import csrf_exempt, csrf_protect
    
    
    class HomeView(View):
    
        @method_decorator(csrf_exempt)
        def dispatch(self, request, *args, **kwargs):
            return super(HomeView, self).dispatch(request, *args, **kwargs)
    
        def get(self, request):
            return render(request, "home.html")
    
        def post(self, request):
            print("Home View POST method...")
            return redirect("/index/")
      
      
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    猜你喜欢

    转载自blog.csdn.net/weixin_43063753/article/details/85317109
    CBV