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:
      • request.session['key'] = value
      • reqeust.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失效策略。
# 使用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。

猜你喜欢

转载自www.cnblogs.com/tmdhhl/p/10586137.html