Cookie与Session
【1】Cookie的发展史
一、诞生背景
HTTP的五大特点,而其中之一便是:无状态
HTTP无状态:服务器无法知道两个请求是否来自同一个浏览器,即服务器不知道用户上一次做了什么,每次请求都是完全相互独立。
早期互联网只是用于简单的浏览文档信息、查看黄叶、门户网站等等,并没有交互这个说法。但是随着互联网慢慢发展,宽带、服务器等硬件设施已经得到很大的提升,互联网允许人们可以做更多的事情,所以交互式Web慢慢兴起,而HTTP无状态的特点却严重阻碍其发展!
交互式Web:客户端与服务器可以互动,如用户登录,购买商品,各种论坛等等
不能记录用户上一次做了什么,怎么办?聪明的程序员们就开始思考:怎么样才能记录用户上一次的操作信息呢?于是有人就想到了隐藏域。
隐藏域写法:
<input type="hidden" name="field_name" value="value">
这样把用户上一次操作记录放在form表单的input中,这样请求时将表单提交不就知道上一次用户的操作,但是这样每次都得创建隐藏域而且得赋值太麻烦,而且容易出错!
ps:隐藏域作用强大,时至今日都有很多人在用它解决各种问题!
网景公司当时一名员工Lou Montulli(卢-蒙特利),在1994年将“cookies”的概念应用于网络通信,用来解决用户网上购物的购物车历史记录,而当时最强大的浏览器正是网景浏览器,在网景浏览器的支持下其他浏览器也渐渐开始支持Cookie,到目前所有浏览器都支持Cookie了。
【2】什么是Cookie
Cookie是一种在客户端存储数据的机制,用于在客户端和服务器之间传递和存储数据。它是由服务器发送给客户端的一小段文本信息,存储在客户端的浏览器中。
- 虽然cookie是服务端告诉客户端浏览器需要保存内容
- 但是客户端可以选择拒绝保存
【3】Cookie的原理

总结:
Cookie的原理是通过在服务器和客户端之间传递和存储数据,实现状态管理和数据交互。服务器发送Cookie给客户端,客户端存储Cookie并在后续请求中发送给服务器,服务器解析和处理Cookie来实现相应的逻辑。
- 虽然cookie是服务端告诉客户端浏览器想要保存内容
- 但是客户端浏览器可以选择拒绝保存,如果禁止了,那么,只是想要记录用户状态的网站登陆成功都无法使用了
# 视图函数的返回值
return HttpResponse()
return render()
return redirect()
obj1 = HttpResponse()
# 操作cookie 这是执行cookie的必备操作
return obj1
obj2 = render()
return obj2
obj3 = redirect()
return obj3
obj.set_cookie(key,value)
request.COOKIES.get(key)
obj.set_cookie(key,value,max_age=5)
【4】Django操作Cookie
- 虽然cookie是服务端告诉客户端浏览器需要保存内容
- 但是客户端浏览器可以选择拒绝保存
- 如果禁止自动保存cookie
- 那么只要是需要登录的网站都没办法正常登录了
# urls.py
path('denglu/',views.denglu),
#
path('home/',views.home),
# views.py
def denglu(request):
if request.method == 'POST':
username = request.POST.get('username')
password = request.POST.get('password')
if username == 'jingyi' and password =='1212':
res = redirect('/home/')
res.set_cookie('username', 'jingyi1212')
'''
浏览器不单单会帮你存
而且后面每次访问你的时候还会带着能看的页面
'''
return res
return render(request,'login1.html')
def home(request):
if request.COOKIES.get('username') =='jingyi1212':
return HttpResponse('这个是主页面.vip登陆!!!!')
return redirect('/denglu/')
<! 前端 >
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<form action="" method="post">
<p>username:<input type="text" name="username"></p>
<p>password:<input type="text" name="password"></p>
<input type="submit">
</form>
</body>
</html>

- 只要账号密码登陆正确才能切换到主页面

设置一个装饰器:
'''
用户如果在没有登陆的情况下想访问一个需要登陆的页面
那么先跳转到登陆页面,当用户输入正确的用户名和密码之后。
一个跳转到用户之前想要访问的页面去 ,而不是直接写死。
'''
def login_shi(func):
def inner(request, *args, **kwargs):
# 获取到用户上一次想要访问的url
target_url = request.get_full_path()
# 读取携带的cookie,cookie正确登陆成功
if request.COOKIES.get('jing') == '1314520':
return func(request, *args, **kwargs)
else:
# 读取携带的cookie,不正确的跳转到登陆页面
return redirect(f'/denglu/?next={target_url}')
return inner
def denglu(request):
if request.method == 'POST':
username = request.POST.get('username')
password = request.POST.get('password')
if username == 'jingyi' and password =='1212':
# 获取用户上一次想要访问的url
# 结果可能为空 -- 直接访问denglu
target_url = request.GET.get('target_url')
if target_url:
res = redirect(target_url)
else:
# 登陆成功之后,保存用户登陆状态
res = redirect('/home/')
# max_age = 3 就是设定一个登陆之后的页面停留是的时间
res.set_cookie('jing', '1314520',max_age=3)
'''
浏览器不单单会帮你存
而且后面每次访问你的时候还会带着能看的页面
'''
return res
return render(request,'login1.html')
@login_shi
def home(request):
# if request.COOKIES.get('username') =='jinqu123':
# return HttpResponse('这个是主页面.vip登陆!!!!')
# return redirect('/denglu/')
return HttpResponse('这个是个home页面!!!')
@login_shi
def tian(request):
# if request.COOKIES.get('username') =='jinqu123':
# return HttpResponse('这个是tian页面.vip登陆!!!!')
# return redirect('/denglu/')
return HttpResponse('这个是个tian页面!!!')
@login_shi
def fw(request):
# if request.COOKIES.get('username') =='jinqu123':
# return HttpResponse('这个是fw页面.vip登陆!!!!')
# return redirect('/denglu/')
return HttpResponse('这个是个fw页面!!!')
【5】Django操作Session

一、session的概念及特点
session概念:在计算机中,尤其是在网络应用中,称为“会话控制”。Session 对象存储特定用户会话所需的属性及配置信息。说白了session就是一种可以维持服务器端的数据存储技术。session主要有以下的这些特点:
- session保存的位置是在服务端
- session一般来说要配合cookie使用,如果用户浏览器禁用了cookie,那么只能使用URL重写来实现session的存储功能
- 单纯的使用session来存储用户回话信息,那么当用户量较多时,session文件数量会很多,会存在session查询慢的问题
本质上:session技术就是一种基于后端有别于数据库的临时存储技术
- session数据是保存在服务端的,给客户端返回的是一个随机字符串
- sessionid:随机字符串
- session 里面的数据会默认保持在数据库迁移之后的数据库中
【0】session内部所会发生的事情
- 产生一个随机字符串
- 表中存储随机字符串与加密数据的对应关系
- 并将产生的随机字符串也给客户端发送一份并让其保存
sessionid:随机字符串
# python manage.py makemigrations 数据库的迁移
# python manage.py migrate

- 在默认的情况下session的是时候需要django默认的一张django_session表数据库迁移命令
- django会自己创建很多表。而django_session就是其中的一张表。
- 你只要不更新数据里面的数据就会在14天后消失。
- 当然我们自己也可以人为的修改它。
【1】设置/获取session多个值
- 给session设置多个值的时候,存在数据库中的数据仍是一条
- 但是在取session的时候,可以通过
request.session对象获取到设置的多组键值对
【2】django_sessoin表中的session数据
-
django_sessoin表中的数据条数取决于浏览器
- 同一个计算机(IP地址)上同一个浏览器只会有一条数据生效
- 同一个计算机(IP地址)上多个浏览器会有多个数据生效
- 当session过期的时候,可能会出现多条数据对应一个浏览器
- 但是这些数据不会持久化存储,会被定时清理掉,可以手动清除也可以代码清除
-
目的是为了节省服务器数据库资源.
-
设置session
request.session['Key'] = value
request.session.get('key')
【3】设置过期时间
request.session.set_expiry()
【4】清空session
request.session.flush(): 该方法会立即删除会话数据,并在下一次请求时创建一个新的会话。request.session.clear(): 该方法会清空当前会话的数据,但会话仍然保持有效,下一次请求仍然可以使用同一会话。
请注意,request.session.delete() 方法实际上是用于删除整个会话对象,而不仅仅是清除会话数据。
以下是修正后的示例:
def clear_session(request):
request.session.flush()
或
def clear_session(request):
request.session.clear()
这样可以正确地清除会话数据。非常抱歉给你带来了困惑,感谢你的指正。
【5】示例
# views.py
def set_session(request):
request.session['hobby'] = 'music'
request.session['hobby1'] = 'ball'
request.session['hobby2'] = 'running'
return HttpResponse('ms miss 周!!!')
def get_session(request):
request.session.get('hobby')
print(request.session.get('hobby'))
# music
print(request.session.get('hobby1'))
# ball
print(request.session.get('hobby2'))
# running
return HttpResponse('你哪都小啊!!')
# urls.py
from django.urls import path
from apply03 import views
urlpatterns = [
# session
path('set_session/',views.set_session),
path('get_session/',views.get_session),
]
保存
SESSION_ENGINE = 'django.contrib.sessions.backends.db' # 引擎(默认)
2. 缓存Session
SESSION_ENGINE = 'django.contrib.sessions.backends.cache' # 引擎
SESSION_CACHE_ALIAS = 'default' # 使用的缓存别名(默认内存缓存,也可以是memcache),此处别名依赖缓存的设置
3. 文件Session
SESSION_ENGINE = 'django.contrib.sessions.backends.file' # 引擎
SESSION_FILE_PATH = None # 缓存文件路径,如果为None,则使用tempfile模块获取一个临时地址tempfile.gettempdir()
4. 缓存+数据库
SESSION_ENGINE = 'django.contrib.sessions.backends.cached_db' # 引擎
5. 加密Cookie Session
SESSION_ENGINE = 'django.contrib.sessions.backends.signed_cookies' # 引擎
其他公用设置项:
SESSION_COOKIE_NAME = "sessionid" # Session的cookie保存在浏览器上时的key,即:sessionid=随机字符串(默认)
SESSION_COOKIE_PATH = "/" # Session的cookie保存的路径(默认)
SESSION_COOKIE_DOMAIN = None # Session的cookie保存的域名(默认)
SESSION_COOKIE_SECURE = False # 是否Https传输cookie(默认)
SESSION_COOKIE_HTTPONLY = True # 是否Session的cookie只支持http传输(默认)
SESSION_COOKIE_AGE = 1209600 # Session的cookie失效日期(2周)(默认)
SESSION_EXPIRE_AT_BROWSER_CLOSE = False # 是否关闭浏览器使得Session过期(默认)
SESSION_SAVE_EVERY_REQUEST = False # 是否每次请求都保存Session,默认修改之后才保存(默认)
ttps传输cookie(默认)
SESSION_COOKIE_HTTPONLY = True # 是否Session的cookie只支持http传输(默认)
SESSION_COOKIE_AGE = 1209600 # Session的cookie失效日期(2周)(默认)
SESSION_EXPIRE_AT_BROWSER_CLOSE = False # 是否关闭浏览器使得Session过期(默认)
SESSION_SAVE_EVERY_REQUEST = False # 是否每次请求都保存Session,默认修改之后才保存(默认)

452

被折叠的 条评论
为什么被折叠?



