• Django -- cookie与session


    cookie

      服务端保存在客户端浏览器上的信息都可以称之为cookie,它的表现形式一般都是k:v键值对(cookie就是保存在客户端浏览器上的信息)

    设置

    #设置
        obj.set_cookie(key,value)
    #获取
        request.COOKIES.get(key)
    #超时
        obj.set_cookie('username', 'jason666',max_age=3,expires=3)
        
        max_age
        expires
            两者都是设置超时时间的 并且都是以秒为单位
            需要注意的是 针对IE浏览器需要使用expires
    主动删除cookie(注销功能)

    Cookie操作

    # 视图函数的返回值
    return HttpResponse()
    return render()
    return redirect()
    
    # 操作cookie
    obj1 = HttpResponse()
    return obj1
    
    obj2 = render()
    return obj2
    
    obj3 = redirect()
    return obj3

    例子:

    def login_auth(func):
        def inner(request,*args,**kwargs):
            # print(request.path_info)
            # print(request.get_full_path())  # 能够获取到用户上一次想要访问的url
            target_url = request.get_full_path()
            if request.COOKIES.get('username'):
                return func(request,*args,**kwargs)
            else:
                return redirect('/login/?next=%s'%target_url)
        return inner
    
    def login(request):
        if request.method == 'POST':
            username = request.POST.get('username')
            password = request.POST.get('password')
            if username == 'jason' and password == '123':
    
                # 获取用户上一次想要访问的url
                target_url = request.GET.get('next')  # 这个结果可能是None
                if target_url:
                    obj = redirect(target_url)
                else:
                    # 保存用户登陆状态
                    obj = redirect('/home/')
                # 让浏览器记录cookie数据
                obj.set_cookie('username', 'jason666')
                """
                浏览器不单单会帮你存
                而且后面每次访问你的时候还会带着它过来
                """
                # 跳转到一个需要用户登陆之后才能看的页面
                return obj
        return render(request,'login.html')
    
    
    @login_auth
    def home(request):
        # 获取cookie信息 判断你有没有
        # if request.COOKIES.get('username') == 'jason666':
        #     return HttpResponse("我是home页面,只有登陆的用户才能进来哟~")
        # # 没有登陆应该跳转到登陆页面
        # return redirect('/login/')
        return HttpResponse("我是home页面,只有登陆的用户才能进来哟~")

    session

      数据是保存在服务端的并且它的表现形式一般也是k:v键值对(session就是保存在服务端上的信息)

    设置

    #设置
    request.session['key'] = value
    
    #获取
    request.session.get('key')
    
    #过期时间
    request.session.set_expiry()
        括号内可以放四种类型的参数
            1.整数        多少秒
            2.日期对象        到指定日期就失效
            3.0            一旦当前浏览器窗口关闭立刻失效
            4.不写        失效时间就取决于django内部全局session默认的失效时间(django默认session的过期时间是14天)
    
    #清除
    request.session.delete() 只删服务端的 客户端的不删
    request.session.flush() 浏览器和服务端都清空)

    例子:

    from functools import wraps
    def check_login(func):
        @wraps(func)
        def inner(request,*args,**kwargs):
            url = request.get_full_path()
            if request.session.get("name"):
                return func(request,*args,**kwargs)
            else:
                return redirect("/s_login/?next=%s"%url)
        return inner
    
    def s_login(request):
        if request.method == "POST":
            name = request.POST.get("name")
            pwd = request.POST.get("pwd")
            if name == "jason" and pwd == "123":
                request.session["name"] = name
                url = request.GET.get("next")
                if url:
                    return redirect(url)
                else:
                    return redirect("/logout/")
        return render(request,"s_login.html")
    
    @check_login
    def get(request):
        return HttpResponse(123)
    
    
    @check_login
    def logout(request):
        request.session.flush()
        return HttpResponse("删除了")

    CBV添加装饰器

    装饰器的三种添加方法

    # 方式1:指名道姓(给方法添加装饰器)
    @method_decorator(login_auth) 
    
    # 方式2:可以添加多个针对不同的方法加不同的装饰器
    @method_decorator(login_auth,name='get')  
    @method_decorator(login_auth,name='post')
    
    # 方式3:dispatch会直接作用于当前类里面的所有的方法
    @method_decorator(login_auth)  
        def dispatch(self, request, *args, **kwargs):
            return super().dispatch(request,*args,**kwargs)

    例子:

    from django.views import View
    from django.utils.decorators import method_decorator
    
    class MyLogin(View):
        def dispatch(self, request, *args, **kwargs):
            return super().dispatch(request,*args,**kwargs)
         @method_decorator(login_auth) 
        def get(self,request):
            return HttpResponse("get请求")
    
        def post(self,request):
            return HttpResponse('post请求')
  • 相关阅读:
    2019 SDN阅读作业
    第10组 Alpha冲刺(4/6)
    第10组 Alpha冲刺(3/6)
    2019 SDN上机第3次作业
    团队Beta4
    团队Beta3
    团队Beta2
    团队Beta1
    tuandui last
    团队Arpha6
  • 原文地址:https://www.cnblogs.com/zhenghuiwen/p/13062695.html
Copyright © 2020-2023  润新知