• Django之cookie 和session


    ---恢复内容开始---

    一、cookie

      前戏.cookie 的由来

      由于http协议是无状态的 无法记录用户状态

      cookie就是保存在客户端浏览器上的键值对

      工作原理:当你登陆成功之后 浏览器会保存一些信息

      下次再访问的时候 就会携带着这些信心 访问服务端 服通过识别你携过来的信息进行判断 

      cookie 虽热是写在浏览器的浏览器上的 但是浏览器可以不服从命令 禁止写cookie  这样的结果就会让用户没办法登陆了

      如何操作cookie

      django 返回给客户端浏览器的都必须是HttpResponse对象

      return HttpResponse()

      return render()

      retrurn redirct()

      1.cookie的设置

       后端代码 只有用户登陆成功之后才让他啊进行登陆

      

    def log(request):
        if request.method == 'POST':
    
            username = request.POST.get('username')
            password = request.POST.get('password')
            print(username,'---')
            if username == 'aaa' and password == '123':
                obj = redirect('/home/')
                print(obj)
                obj.set_cookie('username','koko')  # 只要设置了 一会浏览器就会保存cookie k:v
                return obj
        # 先返回一个用户登陆
        return render(request,'log.html')

      

    obj.set_cookie('username','koko',max_age=3)   max_age = 3 是一个秒数进行计算的 也就是说3秒后就失效了 这个cookie 值 页码也会登陆失败 类是强制下线


    设置超时时间
    max_age=None, 访问的时间  
    expires=None, 超时时间(IE requires expires, so set it if hasn't been already.)  被访问的时间 Django 默认14天

      2.cookie的获取

    通过request 获取

    def home(request):
        # 也就是说这里是先让榕湖登陆成功之后才能进行访问的其他页面
        # 获取COOKIE 值
        if request.COOKIES.get('username'):
    
            return HttpResponse('我是home 页面 登陆成功才可以访问')

      3.cookie的删除

     三剑客对象返回 对象 进行删除

    # 删除也就是用户的注销功能
    def logout(request):
        obj = HttpResponse('已经注销')
        obj.delete_cookie('username')
        return obj
    # 现在有一个需求就是比如我刚看见一件衣服想买 点击之后发现并没有登陆 浏览器让我去登陆 并在登陆成功之后 返回到我买衣服的界面
    # 装饰器的对把
    from functools import wraps
    
    def auth_login(func):
        @wraps(func)
        def inner(request, *args, **kwargs):
    
            # 获取路径 塞到返回的页面路径
            # 后端通过get()去就可以了
            # 从request 中获取路径
            target_url = request.get_full_path()
            res = request.COOKIES.get('username')
            if res:
                func(request,*args, **kwargs)
            else:
                return redirect('/log/?index=%s' % target_url)
    
        return inner

    二.session

      session的由来

      session 是保存在服务器上的简直对

      session 虽然保存在浏览器上 但是它依赖于cookie 工作 

      服务器返回给浏览器一个随机的字符串 浏览器键值对的新式进行保存 

      seesionid:随机字符串保存在服务端 

      cookie:浏览器在访问时 就会将随机的字符串携带上 后端获取获取服务端的字符串进行比较

      随机字符串1:数据1

      1.session的设置

    def set_session(request):
        request.session['username'] = 'aaa'
        return HttpResponse('ok')

    session 如何设置时间呢

    def set_session(request):
    request.session['username'] = 'bbb'
    request.session.set_expiry(5) # vlues 参数是秒计算的
    return HttpResponse('ok')

    5秒后sesssion 就会消失

    def get_session(request):
    print(request.session.get('username')) # 再次取值是个空 session >>>None

    return HttpResponse('ok')


    """
    上面这一句话发生了三件事
    1.django 内部自动生成一个随机字符串
    2.将随机字符串和你要保存的数据 写入django_session表中(现在内存中生成一个缓存记录 等到经过中间件的时候才会执行)
    3.将产生的随机字符串发送给浏览器写入cookie
    sessionid:随机字符串
    """

      2.session的获取

    def get_session(request):
        print(request.session.get('username'))
    
        return HttpResponse('ok')

      3.session的删除

      

    def session_logout(request):
        # request.session.delete()  # 只会删除浏览器
        request.session.flush()  # 服务器和浏览器都会删除
        return HttpResponse('ok')

    这用于确保前面的会话数据不可以再次被用户的浏览器访问
    例如,django.contrib.auth.logout() 函数中就会调用它。

    django session默认的超时时间是14天


    django_session表中的一条记录针对一个浏览器

    如果其他浏览器就会产生第二条记录

    三。作业  session 验证用户登陆 返回 访问的页面  》》》装饰器的进行操作  》》》url  返回到登陆的页面

      

      

    def auth_login(func):
        @wraps(func)
        def inner(request, *args, **kwargs):
    
            # 获取路径 塞到返回的页面路径
            # 后端通过get()去就可以了
            # 从request 中获取路径
            target_url = request.get_full_path()
            res = request.COOKIES.get('username')
            if res:
                func(request,*args, **kwargs)
            else:
                return redirect('/log/?index=%s' % target_url)
    
        return inner

    @auth_login
    def shopping(request):
    if request.COOKIES.get('username'):
    print(request.COOKIES.get('username'),'-----==')
    return render(request,'shopping.html') # 有问题 ????

    ValueError at /shopping/
    The view app01.views.shopping didn't return an HttpResponse object. It returned None instead.
    Request Method:    GET
    Request URL:    http://127.0.0.1:8000/shopping/
    Django Version:    1.11.11
    Exception Type:    ValueError
    Exception Value:    
    The view app01.views.shopping didn't return an HttpResponse object. It returned None instead.
    Exception Location:    C:Users10243AppDataLocalProgramsPythonPython36libsite-packagesdjangocorehandlersbase.py in _get_response, line 198
    Python Executable:    C:Users10243AppDataLocalProgramsPythonPython36python.exe
    Python Version:    3.6.4
    Python Path:    
    ['D:\forms_24',
     'D:\forms_24',
     'C:\Users\10243\AppData\Local\Programs\Python\Python36\python36.zip',
     'C:\Users\10243\AppData\Local\Programs\Python\Python36\DLLs',
     'C:\Users\10243\AppData\Local\Programs\Python\Python36\lib',
     'C:\Users\10243\AppData\Local\Programs\Python\Python36',
     'C:\Users\10243\AppData\Roaming\Python\Python36\site-packages',
     'C:\Users\10243\AppData\Local\Programs\Python\Python36\lib\site-packages',
     'C:\Program Files\JetBrains\PyCharm '
     '2018.1.4\helpers\pycharm_matplotlib_backend']
    Server time:    Tue, 24 Sep 2019 17:53:24 +0000
  • 相关阅读:
    词法分析
    HTTP学习笔记
    Servlet入门
    UDP与TCP的区别
    C语言实现血型查询系统
    Mysql的索引、回表查询及覆盖索引浅析
    ReentranLock浅析
    CAS是个什么鬼?
    synchronize和volatile 小知识点总结
    写一个简单的阻塞队列
  • 原文地址:https://www.cnblogs.com/mofujin/p/11580121.html
Copyright © 2020-2023  润新知