• Django中cookie和session使用


    1. 什么是cookie?
      Cookie 是浏览器访问服务器后,服务器传给浏览器的一段数据。浏览器需要保存这段数据,不得轻易删除。 此后每次浏览器访问该服务器,都必须带上这段数据

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

    3. cookie的作用是什么?

      • 识别用户身份
      • 记录历史
    4. 使用方法

      • 设置cookie:
        • response.set_cookie('key', 'value')
        • response.set_signed_cookie(key, value, salt='', max_age=None, ...)
          参数
          • key, 键
          • value, 值
          • max_age=None,超时时间
          • expires=None, 超时时间(IE浏览器)
          • path='/', cookie生效的路径。特殊的:根路径的cookie可以被任何url的页面访问
          • domain=None, Cookie生效的域名
          • secure=False, https传输
          • httponly=False 只能http协议传输,无法被JavaScript获取(不是绝对,底层抓包可以获取到也可以被覆盖
      • 获取cookie:
        • request.COOKIES.get('key')
        • request.COOKIES['key']
        • request.get_signed_cookie(key, default=RAISE_ERROR, salt='', max_age=None)
      • 删除cookie: response.delete_cookie("cookie_key",path="/",domain=name)
    5. cookie的优缺点
      优点:数据存储在客户端。减轻服务端的压力,提高网站的性能
      缺点:安全性不高,在客户端很容易被查看或破解用户会话信息

    6. cookie版登录校验

    def check_login(func):
        @wraps(func)
        def inner(request, *args, **kwargs):
            next_url = request.get_full_path()
            if request.get_signed_cookie("login", salt="SSS", default=None) == "yes":
                # 已经登录的用户...
                return func(request, *args, **kwargs)
            else:
                # 没有登录的用户,跳转刚到登录页面
                return redirect("/login/?next={}".format(next_url))
        return inner
    
    
    def login(request):
        if request.method == "POST":
            username = request.POST.get("username")
            passwd = request.POST.get("password")
            if username == "xxx" and passwd == "dashabi":
                next_url = request.GET.get("next")
                if next_url and next_url != "/logout/":
                    response = redirect(next_url)
                else:
                    response = redirect("/class_list/")
                response.set_signed_cookie("login", "yes", salt="SSS")
                return response
        return render(request, "login.html")
    

    session

    1. 什么是session
      由于cookie存放在用户浏览器上,所以如果将一些重要数据存在cookie中就会造成安全隐患,且浏览器中cookie有大小限制,最大4K,所以使用session,将重要数据保存在服务器端,使用cookie将sessionid存放在浏览器中,访问服务器是自动带上sessionid,服务器根据sessionid进行判断用户是谁。

    2. 使用方法

      • 设置session:

        • response.session['key'] = value
        • response.session.setdefault('key', 'value')
      • 获取session

        • request.session.get('key', None)
        • request.session['key']
      • 删除session

        • del request.session['key']
      • 其他方法

        • request.session.keys()
        • request.session.values()
        • request.session.items()
        • request.session.iterkeys()
        • request.session.itervalues()
        • request.session.iteritems()
        • request.session.session_key 会话session的key
        • request.session.clear_expired() 将所有Session失效日期小于当前日期的数据删除
        • request.session.exists("session_key") 检查会话session的key在数据库中是否存在
        • request.session.delete() 删除当前会话的所有Session数据
        • request.session.flush() 删除当前的会话数据并删除会话的Cookie
        • request.session.set_expiry(value)
          • 如果value是个整数,session会在些秒数后失效。
          • 如果value是个datatime或timedelta,session就会在这个时间后失效。
          • 如果value是0,用户关闭浏览器session就会失效。
          • 如果value是None,session会依赖全局session失效策略。

    可使用django-redis模块进行session和cache操作,相关配置如下

    # 使用redis作为Django缓存数据库
    CACHES = {
    	"default": {
    		"BACKEND": "django_redis.cache.RedisCache",
    		"LOCATION": "redis://localhost:6379/3",
    		"OPTIONS": {
    			"CLIENT_CLASS": "django_redis.client.DefaultClient",
    		}
    	}
    }
    # 使用redis存储session。 
    SESSION_ENGINE = "django.contrib.sessions.backends.cache"
    SESSION_CACHE_ALIAS = "default"
    

    1、cookie数据存放在客户的浏览器上,session数据放在服务器上。

    2、cookie不是很安全,别人可以分析存放在本地的COOKIE并进行COOKIE欺骗
    考虑到安全应当使用session。

    3、session会在一定时间内保存在服务器上。当访问增多,会比较占用你服务器的性能
    考虑到减轻服务器性能方面,应当使用COOKIE。

    4、单个cookie保存的数据不能超过4K,很多浏览器都限制一个站点最多保存20个cookie。

  • 相关阅读:
    第十五次-语法制导的语义翻译
    第十四次--算符优先分析
    第十二次-递归下降语法分析
    第十一次-LL(1)文法的判断,递归下降分析程序
    第十次-消除左递归
    第九次-DFA最小化,语法分析初步
    个人作业——软件工程实践总结作业
    【评分】Alpha阶段
    K 班前7次作业成绩汇总
    【评分】第七次作业--项目需求分析(团队)
  • 原文地址:https://www.cnblogs.com/tmdhhl/p/10586137.html
Copyright © 2020-2023  润新知