hello!我是小J,每天一个小知识,一起学python,让技术无限发散。
cookie和session会话
1. cookie
1.1 cookie简单介绍
cookie,是一种“小型文本文件”,是某些网站为了识别用户的身份,进行session跟踪而存储在用户本地终端(浏览器)上的数据(通常经过加密),由用户客户端计算机暂时或永久保存的信息。是经HTTP协议发起的一种无状态(每次发送的请求都是独立的,不受上一次发送的请求和响应的影响,即“人生如初见,对于服务器而言,每次的请求都是新的”)的会话。
1.2 cookie的设置和读取、清除
1.2.1 设置cookie
因为cookie是在响应中使用的,所以需要使用response对象进行设置,设置cookie就是赋值给浏览器,可以使用response.set_cookie进行设置。set_cookie相关的选项介绍如下:
key:cookie的key
value:cookie的value
max_age:最长的生命周期,单位是秒
expires:过期时间。跟max_age是类似的,只不过这个参数需要传递一个具体的日期,比如datetime或者是符合日期格式的字符串。如果同时设置了expires和max_age,那么将会使用expires的值作为过期时间。
path:对域名下哪个路径有效。默认是对域名下所有路径都有效。
domain:针对哪个域名有效。默认是针对主域名下都有效,如果只要针对某个子域名才有效,那么可以设置这个属性.
secure:是否是安全的,如果设置为True,那么只能在https协议下才可用。
httponly:默认是False。如果为True,那么在客户端不能通过JavaScript进行操作。
def set_cookie(request):
"""
设置cookie
:param request:
:return:
"""
response = HttpResponse('hello python')
# 设置cookie 使用set_cookie() set_cookie的选项介绍
response.set_cookie('name', 'wky')
# response.set_cookie('name1',('wky',123))
# response.set_cookie('name2', {'wky':123})
# response.set_cookie('name3', ['wky', 123])
response.set_cookie('name1', 'wky',max_age=10000) # max_age 设置cookie的过期时间,单位秒
return response
1.2.2 获取cookie
获取浏览器发送过来的使用的是request.COOKIES,获得得到的对象是一个字典类型。
def get_cookie(request):
"""
获取cookie
:param request:
:return:
"""
# 获取cookie使用的是request.COOKIES,获得的获得的对象是一个字典类型
cookies = request.COOKIES
# print(cookies)
return HttpResponse(cookies.items())
1.2.3 删除cookie
删除cookie使用的是request.delete_cookie,删除cookie实际上是将之前设置的cookie的值设为空字符串,并将cookie的过期时间设置为0,就是当浏览器关闭后它就失效。
def delete_cookie(request):
"""
删除cookie
:param request:
:return:
"""
# 通过delete_cookie即可删除cookie。实际上删除cookie就是将指定的cookie的值设置为空的字符串,然后使用将它的过期时间设置为0,也就是浏览器关闭后就过期。
# key 设置的cookie的key
# path = '/' 设置的域名路径
# domain = None 设置的域名
response = HttpResponse('delete success')
response.delete_cookie('name')
return response
路由
# 项目根路由
urlpatterns = [
# 从上往下执行 执行到之后就会去找这个对应子应用中的子路由,然后在返回函数中的数据
path('admin/', admin.site.urls),
# path('books/',include('books.urls')),
path('',include('books.urls',namespace='books')), # 添加子应用注册后所写的路由 namespace给这个对应的子应用其别名
]
# 子路由
from django.urls import path
from django.urls import re_path
from . import views
# 给子应用的路由起别名
app_name = 'books'
urlpatterns = [
# 设置cookie 获取cookie 删除cookie
path('set_cookie',views.set_cookie),
path('get_cookie',views.get_cookie),
path('delete_cookie',views.delete_cookie),
]
①设置cookie结果
通过http://127.0.0.1:8000/set_cookie可以进行路由的设置
从上图中可以看到我们设置的cookie的key,
在浏览器的西欧cookie中,我们可以清楚的看到自己设置的key,vlue以及cookie的过期时间等
② 获取cookie结果
通过http://127.0.0.1:8000/get_cookie获取cookie数据
③删除cookie结果
通过http://127.0.0.1:8000/delete_cookie对cookie进行删除
从图中可以看到我们删除name后,我们所设置的wky的cookie值变成了空字符串,而我们的过期时间也有所变化。
1.3 cookie流程
- cookie流程: 第一次请求的过程 ,我们的浏览器第一次请求服务器的时候,只是单纯的发起请求,是不会带有cookie的
- 第二次请求的时候就会携带cookie进行请求,这样我们的服务器才能够知道是谁的请求
2. session
2.1 session简介
session,在计算机网络应用中,被称为“会话控制”。session对象会存储特定用户会话所需的属性及配置信息,这样,当用户在应用程序和web页跳转时,存储在session对象中的变量不会丢失,而是整个用户的会话会一直保存下去。当用户请求web页面时,如果没有会话,web服务器会自己建立一个session对象,当会话过期或被放弃时,服务器会终止会话。
2.2 session的设置和读取、清除
2.2.1 设置session
session的设置通过request.session[‘xxx’] = 'xx’的格式设置。
def set_session(request):
""" 设置session """
request.session['username'] = 'wky'
request.session['age'] = 20
return HttpResponse('设置session成功')
2.2.2 获取session
session的获取和session的设置相似,怎么设置的session就怎么进行session的获取
# 获取session 怎么设置的session就怎么去获取
def get_session(request):
""" 获取session """
# 获取设置session的用户名 年龄
username = request.session['username']
age = request.session['age']
return HttpResponse(username + ":" + str(age))
2.2.3 清除session
session的清除有clear() 和 flush()两种方法
- session.flush()的作用就是将缓存的session数据进行清理同步到数据库
- session.clear()的作用就是清除session中的缓存数据,不会管数据和数据库的同步
# 清除session 主要有两种方法 clear() 和 flush()
# flush和 clear 都可以清除session数据 flush 会把sessionid也给清除掉里面的内容
# 1 session.flush()的作用就是将session的缓存中的数据与数据库同步。
# 2 session.clear()的作用就是清除session中的缓存数据(不管缓存与数据库的同步)。
def clear_session(request):
request.session.clear()
return HttpResponse('使用clear()清除session')
def flush_session(request):
request.session.flush()
return HttpResponse('使用flush()清除session')
子路由
from django.urls import path
from django.urls import re_path
from . import views
app_name = 'books'
urlpatterns = [
# 设置session 获取session 清除session
path('set_session',views.set_session),
path('get_session',views.get_session),
path('clear_session',views.clear_session),
path('flush_session',views.flush_session),
]
结果展示
①查询结果展示
首先通过http://127.0.0.1:8000/set_session进行设置session,
但是顿时就报错了,在设置session这一部分需要注意的是,在运行项目时,需要到terminal中进入到根目录下使用python manage.py migrate导入Django中相应的库才能够正常使用。
再通过http://127.0.0.1:8000/set_session正常设置session
可以看到原来cookie的地方新增了一个sessionid,并且对内容进行了加密处理。
②获取session结果展示
通过http://127.0.0.1:8000/get_session获取session
③清除session结果展示
使用clear()清除session,通过http://127.0.0.1:8000/clear_session
发现没有变化,实际上已经进行了session的清除,之所以没有变化是因为浏览器本地缓存的原因
使用flush()进行session的清除,通过http://127.0.0.1:8000/flush_session
从上图中发现我们sessionid中的内容变成了空字符串,实现了session的清除
3. cookie和session的区别
总结
本文属于作者原创,转载请注明出处,不足之处,希望大家能过给予宝贵的意见,如有侵权,请私信。每天一个小知识,一起学python,让技术无限发散