django中的cookie与session

打印 上一主题 下一主题

主题 880|帖子 880|积分 2640

发展史

1.早期的时候,网站都没有保存用户功能的需求,所有用户访问网站返回的结果都是一样的,比如新闻、文章等网站!
2.但是,随着网站的发展,出现了一些需要保存用户信息的网站,比如:淘宝、京东、个人博客等!
3.以登录功能为例,如果不保存用户登录的信息,就意味着用户每次都需要重新登录网站,为此非常的麻烦。
4.为了解决上述的麻烦,便产生了cookie和session

1.cookie

1.1 什么是cookie

当用户第一次登录之后,浏览器会将您登录之后的用户名和密码保存到用户浏览器,让其保存在本地,之后再次访问网站的时候,浏览器会帮您自动的将保存的用户名和密码发送到浏览器,这样就省去了登录的操作!
装逼小技巧:当你点击浏览器的设置,在里面查找cookie权限时,选择不允许站点保存cookie时,以后该浏览器上需要用到记录用户状态(登录)的功能都无法实现了!

1.2 为什么要用cookie

为了减少每次登录网站都要登录的麻烦,减少用户每次操作都需要登录的操作(每次添加到购物车一下就需要登录将非常的麻烦)!
1.3 cookie的危害

早期这样将用户的信息保存在浏览器是有非常大的隐患的!其他人很容易在浏览器内看到你保存的用户名和密码,这样用户的信息就不安全了!

1.4 如何使用cookie
  1. 存储/添加/修改:
  2. def set_cookies(request):
  3.     resp = HttpResponse('set cookies is ok')
  4.     resp.set_cookie('uuname', 'zhangyang', max_age=500,expires=500)
  5. return resp
  6. 每一个响应对象对有一个set_cookies方法里面的参数分别是:key、value、max_age保存时间单位s,expires对于ie浏览器生效的保存时间
  7. 删除:
  8. httpresponse.delete_cookie(‘key’)--删除指定key的cookie,如果key不存在,则什么也不发生
  9. 获取cookies:
  10. ​value = request.COOKIES.get('key’,'默认值‘)
复制代码
利用cookie制作动态跳转登录
  1. from django.shortcuts import render
  2. from django.http import HttpResponse,HttpResponseRedirect
  3. # 装饰器 实现功能是只有登录了之后才能访问到该页面,否则跳转到登录页面
  4. def login_out(func):
  5.     def wrapper(request,*args,**kwargs):
  6.         target_url = request.get_full_path()
  7.         # print(target_url)
  8.         if request.COOKIES.get('username'):
  9.             res=func(request,*args,**kwargs)
  10.             return res
  11.         else:
  12.             # 此处的设计是为了动态的获取用户是从那个页面进行登录的,如何执行登录之后在跳转回该页面
  13.             return HttpResponseRedirect('/login?next=%s'%target_url)
  14.     return wrapper
  15. # Create your views here.
  16. def login(request):
  17.     if request.method == 'POST':
  18.         username = request.POST.get('username')
  19.         password = request.POST.get('password')
  20.         if username=='zhang' and password=='123':
  21.             # 获取用户是从哪个页面登录的url
  22.             url = request.GET.get('next')
  23.             if url:
  24.                 # 获取到了则登录成功跳转到该页面
  25.                 obj = HttpResponseRedirect(url)
  26.             else:
  27.                 # 没有获取到则跳转到默认页面
  28.                 obj = HttpResponseRedirect('/login')
  29.             obj.set_cookie('username','zhang')
  30.             return obj
  31.     return render(request,'login.html')
  32. @login_out
  33. def home(request):
  34.     return HttpResponse('这是登录之后的home页面')
  35. @login_out
  36. def index(request):
  37.     return HttpResponse('这是登录之后的导航页')
复制代码
2. session

2.1 什么是session

为了解决cookie产生的危害,便产生了session,session是借助cookie进行工作的!当用户将登录的信息返回到服务器,服务器会将用户的信息保存在服务器内并返回一个随机的字符串给浏览器,该字符串与这个用户的信息相对应!浏览器将这个随机字符串以cookie的形式保存在浏览器本地,以后每次需要访问网站的时候,浏览器就会把这个cookie的随机字符串返回给服务器,服务器匹配与之对应的用户信息返回给前端!

2.2 为什么要有session

为了解决cookie所存在的安全隐患,更好的保护用户的隐私。
2.3 如何使用session
  1. session对象是一个类似于字典的对象,可以用类似字典的方式进行操作--session能够存储字符串、整形、字典、列表等
  2. 1.保存session的值到服务器
  3. def set_session(request):
  4.     request.session['uname'] =  'wwc'   ---存储session的写法
  5. """
  6.     内部发送了那些事
  7.         1.django内部会自动帮你生成一个随机字符串
  8.         2.django内部自动将随机字符串和对应的数据存储到django_session表中
  9.             2.1先在内存中产生操作数据的缓存
  10.             2.2在响应结果django中间件的时候才真正的操作数据库
  11.         3.将产生的随机字符串返回给客户端浏览器保存
  12. """
  13. return HttpResponse('set session is ok')
  14. 存储时会报错时,可能是因为没有执行数据库迁移命令,因为session是保存在服务端的,它需要django中有一张默认的django_session表
  15. 2.获取已经存储的session值
  16. def get_session(request):
  17.     value = request.session.get['uname',默认值]
  18. """
  19.     内部发送了那些事
  20.         1.自动从浏览器请求中获取sessionid对应的随机字符串
  21.         2.拿着该随机字符串去django_session表中查找对应的数据
  22.         3.
  23.             如果比对上了 则将对应的数据取出并以字典的形式封装到request.session中
  24.             如果比对不上 则request.session.get()返回的是None
  25. """
  26. return HttpResponse('session value is %s' % value)
  27. 3.删除session
  28. del request.session['key']
  29. request.session.delete()  # 只删服务端的 客户端的不删
  30. request.session.flush()  # 浏览器和服务端都清空(推荐使用)
  31. 4.设置session的保存时长(默认是2周)
  32. 法一:
  33.         request.session.set_expiry()
  34.         括号内可以放四种类型的参数
  35.         1.整数                多少秒
  36.         2.日期对象        指定日期就失效
  37.         3.0                一旦当前浏览器窗口关闭立刻失效
  38.         4.不写                失效时间就取决于django内部全局session默认的失效时间
  39. 法二:
  40.         在setting.py中添加配置项SESSION_COOKIE_AGE=60*60*24*7*2
  41.         或者设置SESSION_EXPIRE_AT_BROWSER_CLOSE = True---表示只要浏览器关闭时,session就失效(默认为Flase)
  42. 5.其他需要了解的知识点
  43. session是保存在服务端的 但是session的保存位置可以有多种选择
  44.         1.MySQL
  45.         2.文件
  46.         3.redis
  47.         4.memcache
  48.         ...
  49. django_session表中的数据条数是取决于浏览器的
  50.         同一个计算机上(IP地址)同一个浏览器只会有一条数据生效
  51.         (当session过期的时候可能会出现多条数据对应一个浏览器,但是该现象不会持续很久,内部会自动识别过期的数据清除 你也可以通过python3 manage.py clearsessions清除)
  52.         主要是为了节省服务端数据库资源
复制代码
小练习:如何利用session完成动态跳转登录

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

正序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

农妇山泉一亩田

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表