Django:Session和Cookie

1、Session和Cookie的关系是什么?

  • Session是基于Cookie, 是因为把数据写入session时将会生成一个随机字符串并将随机字符串存入cookie。
  • 读取时,是先从cookie中获取这个随机字符串,再根据这个随机字符串,去服务器数据库获取session内容
  • 在SessionMiddleware中的process_request方法里面可以看到

1.1、session和cookie的区别

  • a) 存放位置:session存放于服务器,cookie存放在客户端;
  • b) 安全性:cookie不安全,session安全,因此session在服务端,cookie在客户端;
  • c)
    大小限制:cookie会由客户端浏览器控制,单个cookie保存的数据不能超过4K,很多浏览器都限制一个站点最多保存20个cookie。而session在在服务端,理论上没有大小限制。
  • d)
    系统性能影响:session存在服务端,当session比较多的情况下,服务端会受其影响,而cookie在客户端,不会影响服务器性能。

2、cookie操作

例:设置cookie

from django.template import loader ,Context
from django.http import HttpResponse

def main(request):
      #不用模板
      response= HttpResponse('test')
      response.set_cookie('my_cookie','cookie value')
      return response

def main(request):
      #用模板
      response= render_to_response('xxxx.html', {})
      response.set_cookie('my_cookie','cookie value')
      return response

例:获取cookie


def get_cookie(request):
    """获取cookie"""
    name = request.COOKIES['name']
    return HttpResponse(name)

3、Session操作

参考文章:https://www.cnblogs.com/Minlwen/p/10488676.html

Session中的操作方法:
1、获取 request.session.get(key)或者是request.session[key]
2、写入request.session[key] = value
3、删 del request.session[key]
4、删除当前session request.session.flush()

Session的过期时间设置:方法是set_expiry(value)
1.如果value=0那么浏览器关闭时,session会过期
2.如果value=datetime或者timedelta就是设置到什么时间点过期,必须要在settins.py中设置SESSION_SERIALIZER = ‘django.contrib.sessions.serializers.PickleSerializer’
3.如果value=None,跟全局的settings.py中的SESSION_COOKIE_AGE决定

Session存入的值是一个Base64加密的串,可以进行解密
MD5:不可逆加密
暴力破解,匹配

例:

def welcome(request):
	# 写入Session
	se = request.session
	login_user_name = se.get('login_user_name')
	return render(request, "welcome.html", {'login_user_name': login_user_name})

# 登录页面
def login(request):

	return render(request, "login.html")

# 登录的业务逻辑
def do_login(request):
	# 获取登录用户名、密码
	userName = request.POST.get('userName')
	# 存在就将用户名写入session
	request.session['login_user_name'] = userName
	return redirect("/user/welcome")

# 注销逻辑
def logout(request):
	# 把userName从当前的session移除
	# del request.session['login_user_name']
	request.session.flush()

	return redirect("/user/welcome")

4、session在哪儿?

前面讲了这么多,有人可能还是不知道session到底在哪儿,到底存在哪儿?

4.1、服务器里

这里我用一个django项目举例

比如“登陆某个页面,服务器需要记录这个登录用户的id”,我们创建session记录id

这里的request.session[key] = value便会自动存入服务器和前端

在这里插入图片描述
在页面登录成功后,我们返回服务器查看数据库

服务器里,session就存在这里
在这里插入图片描述

4.2、浏览器端(客户端)

用户登录前,我们查看到cookie的内容大概是这样的
在这里插入图片描述
登录后
在这里插入图片描述
我们发现cookie里多了个session字段,用于保存session_key,然后根据这个key获取服务器用户登录信息

发布了136 篇原创文章 · 获赞 30 · 访问量 7048

猜你喜欢

转载自blog.csdn.net/a__int__/article/details/105019282