Django Cookie和Session使用(十一)

末蓝、 2024-04-20 12:25 136阅读 0赞

Cookie具体指一小段信息,它是服务器发送出来存储在浏览器上的一组键值对,下次访问服务器时浏览器会自动携带这些键值对,以便服务器提取有用信息。

1、服务器让浏览器进行设置的

2、保存在浏览器本地,浏览器也可以不保存

3、下次访问自动携带cookie保存的信息

操作Cookie

(1) 设置cookie

  1. response.set_cookie(key,value)

(2) 获取cookie

  1. request.COOKIES.get(key)

(3) 设置cookie的时候可以添加一个超时时间

  1. response.set_cookie('userid', '2',max_age=7*24*300,expires=7*24*300)

max_age, expires
两者都是设置超时时间的 并且都是以秒为单位
需要注意的是 针对IE浏览器需要使用expires

(4) 手动删除cookie(注销功能)

  1. response.delete_cookie('userid')

二、Session

保存在服务器上的一组组键值对,必须依赖于Cookie

为何使用Session

1、cookie保存在浏览器本地不安全,

2、cookie的大小收到限制

操作Session

(1) session数据是保存在服务端的,给客户端返回的是一个随机字符串

  1. #客户端
  2. sessionid:随机字符串

e0b6350674f2419c9d4f2d2b1dbf4e16.png

(2)设置session

  1. request.session['key'] = value

1.django内部会自动帮你生成一个随机字符串
2.django内部自动将随机字符串和对应的数据存储到django_session表中
2.1先在内存中产生操作数据的缓存
2.2在响应结果django中间件的时候才真正的操作数据库
3.将产生的随机字符串返回给客户端浏览器保存

1c8bd9e9e70a45e4b05c679f9b799fa4.png

(3)设置过期时间

  1. request.session.set_expiry(7*24*300)

源码:

b043d7b4447947c38fb4ba8333218677.png

括号内可以放四种类型的参数

integer 整数 : 多少秒
datetime日期对象 : 到指定日期就失效
0 : 一旦当前浏览器窗口关闭立刻失效
不写 : 失效时间就取决于django内部全局session默认的失效时间

(4) 获取session

  1. request.session.get('key')

(5) 清除session

  1. session_key=request.session.session_key
  2. request.session.delete(session_key)

request.session.delete() # 只删服务端的 客户端的不删

(1) 模型数据

  1. from django.db import models
  2. # Create your models here.
  3. class UserModel(models.Model):
  4. username=models.CharField(max_length=30,unique=True)
  5. password=models.CharField(max_length=10)
  6. age=models.IntegerField(default=17)
  7. class Meta:
  8. db_table='user'
  9. verbose_name='用户'
  10. verbose_name_plural=verbose_name
  11. #记得迁移文件

(2-1)首页

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>首页</title>
  6. </head>
  7. <body>
  8. <h1>首页</h1>
  9. <hr/>
  10. {% if user %}
  11. 当前登录用户:<h3>{
  12. { user.username }} <a href="{% url 'logout' %}">注销</a></h3>
  13. {% else %}
  14. <a href="{% url 'register' %}">注册</a>
  15. <a href="{% url 'login' %}">登录</a>
  16. {% endif %}
  17. </body>
  18. </html>

(2-2)注册页面

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>注册</title>
  6. </head>
  7. <body>
  8. <h1>注册</h1>
  9. <hr/>
  10. {# 表单提交#}
  11. <form action="" method="post">
  12. {% csrf_token %}
  13. <p>用户<input type="text" name="username"></p>
  14. <p>密码<input type="password" name="password"></p>
  15. <p>年龄<input type="text" name="age"></p>
  16. <p><button>注册</button></p>
  17. </form>
  18. </body>
  19. </html>

(2-3) 登录页面

  1. <body>
  2. <h1>登录</h1>
  3. <hr/>
  4. <form action="" method="post">
  5. {% csrf_token %}
  6. <p>用户<input type="text" name="username"></p>
  7. <p>密码<input type="password" name="password"></p>
  8. <p><button>登录</button></p>
  9. </form>
  10. </body>

(3)路由

  1. urlpatterns = [
  2. path('', index), # 默认打开首页
  3. # 起别名
  4. path('index/', index, name='index'),
  5. path('login/', login, name='login'),
  6. path('register/', register, name='register'),
  7. path('logout/', logout, name='logout'),
  8. path('admin/', admin.site.urls),
  9. ]

(4)视图

  1. from django.http import HttpResponse
  2. from django.shortcuts import render, redirect
  3. from django.urls import reverse #路由
  4. from user.models import *
  5. # Create your views here.
  6. #首页
  7. def index(request):
  8. #获取cookie数据
  9. # uid=request.COOKIES.get('userid',0)
  10. # 获取session数据
  11. uid = request.session.get('userid', 0)
  12. #获取登录的用户信息
  13. user = UserModel.objects.filter(id=uid).first()
  14. return render(request,"index.html",{'user':user})
  15. #注册
  16. def register(request):
  17. #判断
  18. if request.method=='GET':
  19. return render(request,"register.html")
  20. elif request.method=='POST':
  21. #请求数据
  22. uname=request.POST.get('username')
  23. upass=request.POST.get('password')
  24. age=request.POST.get('age')
  25. print(uname,upass,age,sep='=======') #后台打印
  26. #先判断用户是否存在
  27. username=UserModel.objects.filter(username=uname)
  28. if username.exists():
  29. return HttpResponse('用户已存在!')
  30. #添加到数据库中
  31. try:
  32. user=UserModel()
  33. user.username=uname
  34. user.password=upass
  35. user.age=age
  36. user.save()
  37. except:
  38. return HttpResponse('注册失败!')
  39. #注册成功,直接跳到登录页面
  40. return redirect(reverse('login'))
  41. #登录
  42. def login(request):
  43. # 判断
  44. if request.method == 'GET':
  45. return render(request, "login.html")
  46. elif request.method == 'POST':
  47. # 请求数据
  48. uname = request.POST.get('username')
  49. upass = request.POST.get('password')
  50. print(uname, upass, sep='=======') # 后台打印
  51. #2.登录验证
  52. users=UserModel.objects.filter(username=uname,password=upass)
  53. #判断
  54. if users.exists():
  55. #获取数据
  56. user=users.first()
  57. #3.设置cookie
  58. #跳转到首页
  59. response=redirect(reverse('index'))
  60. #创建cookie,设置过期时间max_age=7天
  61. # response.set_cookie('userid',user.id,max_age=7*24*300)
  62. # response.set_cookie('userid',user.id)
  63. #使用session
  64. request.session['userid']=user.id
  65. #设置过期时间
  66. # request.session.set_expiry(7*24*300)
  67. return response
  68. #注销
  69. def logout(request):
  70. # 跳转到首页
  71. response = redirect(reverse('index'))
  72. #删除cookie
  73. # response.delete_cookie('userid')
  74. # 删除session
  75. session_key=request.session.session_key
  76. request.session.delete(session_key)
  77. #返回
  78. return response

(5)运行

d028c7ccd28343daae5322c6c2befcfb.png

f43b8857c6774803a52cccf03d46f6e6.png

c39582e31fe242f6b5a148ed4b753f20.png

8b63e986c3d84195b0038ecd90bbb153.png

1f23033919e64a87b852c0c5fff48247.png

四、总结

cookie就是保存在客户端浏览器上的信息
session就是保存在服务端上的信息
session是基于cookie工作的(其实大部分的保存用户状态的操作都需要使用到cookie)

发表评论

表情:
评论列表 (有 0 条评论,136人围观)

还没有评论,来说两句吧...

相关阅读

    相关 DjangoCookie Session

    3. Cookie 和 Session 会话 因为 HTTP 协议是无状态的,每次浏览器请求 `request`都是无状态的,后台服务器无法识别当前请求与上一次请求及之后