zoukankan      html  css  js  c++  java
  • Django之cookie 和 session

    一、

    1、cookie的由来!!!

        由于HTTP协议是无状态的,既每一次的请求都是独立的,他不会因为你之前来过,就记住你,所以每次浏览器去访问服务器的时候,都是一个全新的过程,之前的数据也不会保留,所以为了解决这个问题,cookie诞生了。

    2、什么是cookie?

        Cookie具体指的是一段小信息,他是服务器发送出来存储在浏览器一组键值对,下次访问浏览器时会自动携带这些键值对,以便服务器提取信息。简单来说就是,Cookie会在你访问服务器时给你一个标记,下一次你再来访问只要携带这个标记,就能够访问了。所以他只认标记,不认用户。用的最普遍的就是做登录系统。

    3、Cookie的工作原理。

        原理:由服务器产生内容,浏览器收到请求后保存在本地;当浏览器再次访问时,浏览器会自动带上Cookie,这样服务器就能通过Cookie的内容来判断是谁了。

    4、查看cookie

        Name 和 Value就是键值对

    二、Djangoz中操作Cookie

      1、获取cookie   

    request.COOKIES['key']
    request.get_signed_cookie(key, default=RAISE_ERROR, salt='', max_age=None)

      参数:

        default:默认值

        salt:加密盐

        max_age:生命周期

      2、设置cookie

    ret = render (request,'html文件')
    ret.set_cookie('key','value')
    return ret

        通过set_cookie,这样就对ret 设置了cookie。

       参数:

          key:键

          value:值

          max_age=None,超时时间

          expires = None,超时时间,用于IE浏览器的

          path='/':Cookie生效的路径,/表示根路径,他比较特殊。根路径的cookie可以被任何url页面访问。

          domain = None,cookie生效的域名

          secure= False:https传输

          httponly = False:只能http协议传输,无法被JavaScript获取。(不是绝对的,底层抓包可以获取到,也可以被覆盖)

      3、删除cookie

    def logout(request):
        rep = redirect("/login/")
        rep.delete_cookie("key")  # 删除用户浏览器上之前设置的cookie
        return rep

      4、Cookie版登录校验的示例

    from django.shortcuts import render, redirect, HttpResponse
    
    # 这是一个装饰器,封装了一个匹配cookie的功能
    def login_required(fn):
        def inner(request, *args, **kwargs):
            if not request.COOKIES.get('is_login') == '1':          # 获取cookie的键'is_login',判断它的值是不是1,如果不是就获通过path_info获取到域名之后的路径next
                next = request.path_info                            # cookie匹配不上,就跳转到登录界面,不过这个登录界面拼接了路径。/login/?next={}'.format(next),
                                                                    # 拼接的后缀就是为了能够确保,从哪个页面失败人后进入的登录界面,登陆成功后跳回对应的页面
               return redirect('/login/?next={}'.format(next))                                                                
            ret = fn(request, *args, **kwargs)                        # 如果匹配成功,就跳转到被装饰得页面。
    
            return ret
    
        return inner
    
    # 这是一个登录函数
    def login(request):
        if request.method == 'POST':                    # 判断请求方法,是POST方法,执行下面的操作
            user = request.POST.get('user')
            pwd = request.POST.get('pwd')
            if user == 'alex' and pwd == 'alexdsb':        # 如果用户名和密码匹配成功了
                next = request.GET.get('next')            # 通过GET方法,获取next。
    
                if next:                                # 如果next有值,说明不是直接进的登录界面,而是访问其他路径,没有成功,通过装饰器拼接了next跳转过来的
                    ret = redirect(next)                # next有值,就跳到next这个路径下
                else:                                    # 如果next没有值,说明是直接进入的登录界面,登陆成功后,直接跳转到'/index/'界面
                    ret = redirect('/index/')            
    
                ret.set_cookie('is_login', '1', max_age=5)        # 设置cookie值cookie('键','值','最大死亡时间')
                return ret                                
    
        return render(request, 'login.html')
    
    
    @login_required                                        
    def home(request):                                    # 被装饰器装饰的函数,
        return HttpResponse('这是home页面')
    
    
    @login_required
    def index(request):
        return render(request, 'index.html')
    
    # 注销函数
    def logout(request):
        ret = redirect('/login/')
    
        ret.delete_cookie('is_login')                    # 删除cookie之后,跳转回登录页面
    
        return ret

    三、Session

      1、Session的由来

        由于Cookie是存在浏览器上的,所以很不安全,随时可能被拦截和窃取,同时Cookie最大支持4096个字节,多了就没法存储了。这时,为了解决这个问题,提高cookie的安全性,有了Session。它能够支持更多的字节,并且把保存在服务器上,有较高的安全性。  

         由于HTTP是无状态的,所以服务器也不知道是谁再访问,所以就需要Cookie做桥接。给每个客户端的Cookie分配一个唯一的ID,这样用户在访问时,通过Cookie,服务器就知道来的认识谁。

       2、Django中Session的用法

        1、

    # 获取、设置、删除Session中数据
    request.session['k1']
    request.session.get('k1',None)
    request.session['k1'] = 123
    request.session.setdefault('k1',123) # 存在则不设置
    del request.session['k1']
    
    
    # 所有 键、值、键值对
    request.session.keys()
    request.session.values()
    request.session.items()
    request.session.iterkeys()
    request.session.itervalues()
    request.session.iteritems()
    
    # 会话session的key
    request.session.session_key
    
    # 将所有Session失效日期小于当前日期的数据删除
    request.session.clear_expired()
    
    # 检查会话session的key在数据库中是否存在
    request.session.exists("session_key")
    
    # 删除当前会话的所有Session数据
    request.session.delete()
      
    # 删除当前的会话数据并删除会话的Cookie。
    request.session.flush() 
        这用于确保前面的会话数据不可以再次被用户的浏览器访问
        例如,django.contrib.auth.logout() 函数中就会调用它。
    
    # 设置会话Session和Cookie的超时时间
    request.session.set_expiry(value)
        * 如果value是个整数,session会在些秒数后失效。
        * 如果value是个datatime或timedelta,session就会在这个时间后失效。
        * 如果value是0,用户关闭浏览器session就会失效。
        * 如果value是None,session会依赖全局session失效策略。

      3、Session流程解析

      3、Session版登录验证

    from functools import wraps
    
    
    def check_login(func):
        @wraps(func)
        def inner(request, *args, **kwargs):
            next_url = request.get_full_path()
            if request.session.get("user"):
                return func(request, *args, **kwargs)
            else:
                return redirect("/login/?next={}".format(next_url))
        return inner
    
    
    def login(request):
        if request.method == "POST":
            user = request.POST.get("user")
            pwd = request.POST.get("pwd")
    
            if user == "alex" and pwd == "alex1234":
                # 设置session
                request.session["user"] = user
                # 获取跳到登陆页面之前的URL
                next_url = request.GET.get("next")
                # 如果有,就跳转回登陆之前的URL
                if next_url:
                    return redirect(next_url)
                # 否则默认跳转到index页面
                else:
                    return redirect("/index/")
        return render(request, "login.html")
    
    
    @check_login
    def logout(request):
        # 删除所有当前请求相关的session
        request.session.delete()
        return redirect("/login/")
    
    
    @check_login
    def index(request):
        current_user = request.session.get("user", None)
        return render(request, "index.html", {"user": current_user})
    
    Session版登录验证
    Session 版登录验证
  • 相关阅读:
    Pytest --快速入门和基础讲解
    Python并发编程(一):多进程(理论篇)
    【面试出题】三数之和
    python 基础:迭代器、生成器
    python垃圾回收机制
    50道Python面试题集锦
    Web自动化测试框架改进
    linux 三剑客
    函数的参数
    生成器
  • 原文地址:https://www.cnblogs.com/wf123/p/9783600.html
Copyright © 2011-2022 走看看