• Django——基于cookie的登录认证 CBV加装饰器


    一、基于cookie的登录认证

    urls.py

    from django.urls import path
    from app01 import views
    urlpatterns = [
           # cookie版登录
           path('login/', views.login),
           path('order/', views.order),
           path('logout/', views.logout),
           path('userinfo/', views.userinfo),
    ]

    #有3个页面 (登录,内容,用户信息)

    login.html

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
    </head>
    <body>
    <form action="" method="post">
        <p>用户名:<input type="text" name="name"></p>
        <p>密码:<input type="password" name="password"></p>
        <p><input type="submit" value="提交"></p>
    </form>
    </body>
    </html>

    order.html

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
    </head>
    <body>
    
    
    <a href="/logout/">点我退出</a>
    </body>
    </html>

    userinfo.html

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
    </head>
    <body>
    <h1>用户信息页面</h1>
    </body>
    </html>

    views.py

    from django.shortcuts import render, HttpResponse, redirect
    ## 登录认证装饰器
    
    def login_auth(func):
        def inner(request, *args, **kwargs):
            # 登录校验
            name = request.COOKIES.get('name')
            if name:
                res = func(request, *args, **kwargs)
                return res
            else:
                path = request.get_full_path() 
                return redirect('/login/?returnUrl=%s' % path) #之前的页面
    
        return inner
    
    
    ### cookie版登录
    def login(request):
        if request.method == 'GET':
    
            return render(request, 'login.html')
        else:
            name = request.POST.get('name')
            password = request.POST.get('password')
            if name == 'lqz' and password == '123':
                # 写入cookie
                # 登录成功,重定向
                path = request.GET.get('returnUrl')
                if path:
                    obj = redirect(path)
                else:
                    obj = redirect('/index/') #或者重定性到其他页面
                obj.set_cookie('name', name)
                return obj
            else:
                return HttpResponse('用户名或密码错误')
    
    
    # def order(request):
    #     name = request.COOKIES.get('name')
    #     if name:
    #         return render(request,'order.html')
    #     else:
    #         return redirect('/login')
    
    ## 装饰器版本(只要加了装饰器,一旦进入这个视图函数,就表明登录成功了)
    @login_auth
    def order(request):
        return render(request, 'order.html')
    
    
    @login_auth
    def userinfo(request):
        return render(request, 'userinfo.html')
    
    
    def logout(request):
        obj = HttpResponse('退出登录成功')
        obj.delete_cookie('name')
        return obj

      views.py中 logout函数为啥不用ajax ?

    如果用ajax发请求,只能返回页面或json格式数据,这个响应是ajax接收到的而不是浏览器,数据也都在ajax里,
    需要手动把cookie删除,ajax是删除不掉的。(收麻烦,删麻烦)
    另外用ajax发请求,需要手动把cookie拼在ajax请求头里再发,很麻烦。(发麻烦)

    二、CBV加装饰器

    在上面登录认证功能的基础上,如果要变成类

    views.py需要加上

    from django.views import View
    from django.utils.decorators import method_decorator
    
    # 使用登录认证装饰器
    # 用法一
    # @method_decorator(login_auth,name='get') #给get函数加上login_auth装饰器
    # @method_decorator(login_auth,name='post')#如果是post那就写post
    class UserInfo(View):
        def get(self, request, *args, **kwargs):
            return HttpResponse('userinfo get')
    
    #方法二
    class UserInfo(View):
        # 装饰器加这里
        @method_decorator(login_auth)
        def get(self, request, *args, **kwargs):
            return HttpResponse('userinfo get')
    
    # 总结:两种用法
        -加在类上:@method_decorator(login_auth,name='get')
        -加载方法上:@method_decorator(login_auth)
  • 相关阅读:
    PHP与MySQL动态网站开发
    巧学巧用 Dreamweaver CS6制作网页
    PHP+MySQL网站开发全程实例
    电商店铺装修攻略
    代码 里面 跟 xib 里面要一致,不然 程序不知道 往东 往西了,
    这样2b的代码,
    controller的frame
    string的length不可能等于 0的,好吧,
    计算字体的高度时候,计算的字体要跟 xib 里面字体的大小 要一致的,不然计算的高度是没有意义的,
    关于 frame
  • 原文地址:https://www.cnblogs.com/guojieying/p/13850662.html
Copyright © 2020-2023  润新知