- 浏览器请求服务器是无状态的。无状态指一次用户请求时,浏览器、服务器无法知道之前这个用户做过什么,每次请求都是一次新的请求
- 无状态的应用层面的原因是:浏览器和服务器之间的通信都遵守HTTP协议
- 根本原因是:浏览器与服务器是使用Socket套接字进行通信的,服务器将请求结果返回给浏览器之后,会关闭当前的Socket连接,而且服务器也会在处理完页面后销毁页面对象。
- 当需要保存用户浏览状态时,如用户状态,商品浏览记录等,可以通过以下两种方式:
在客户端存储信息使用Cookie
在服务器端存储信息使用Session
Cookie
- Cookie,有时也用其复数形式Cookies,指某些网站为了辨别用户身份、进行session跟踪而储存在用户本地终端上的数据(通常经过加密)
- Cookie是由服务器端生成,发送给User-Agent(一般是浏览器),浏览器会将Cookie的key/value保存到某个目录下的文本文件内,下次请求同一网站时就发送该Cookie给服务器(前提是浏览器设置为启用cookie)
- Cookie名称和值可以由服务器端开发自己定义,这样服务器可以知道该用户是否是合法用户以及是否需要重新登录等。服务器可以利用Cookies包含信息的任意性来筛选并经常性维护这些信息,以判断在HTTP传输中的状态。
- Cookie是存储在浏览器中的一段纯文本信息,建议不要存储敏感信息如密码,因为电脑上的浏览器可能被其它人使用
Cookie的特点
- Cookie以键值对的格式进行信息的存储
- Cookie在服务端创建后,发送到客户端保存,再次访问时随着请求发送到服务器端
- Cookie基于域名安全,不同域名的Cookie是不能互相访问的
- Cookie的典型应用:记住用户名,网站的广告推送
设置Cookie
- 修改urls.py文件:
url(r'^cookie_set/$', views.cookie_set),
- 修改
views.py
文件,创建视图cookie_set
def cookie_set(request):
response = HttpResponse("<h1>设置Cookie,请查看响应报文头</h1>")
response.set_cookie('ck1', 'hello')
return response
- 通过浏览器查看Cookie信息
读取Cookie
Cookie信息被包含在请求头中,使用request对象的COOKIES属性访问。
- 修改
cookie_set()
函数
def cookie_set(request):
response = HttpResponse("读取Cookie,数据如下:<br>")
if 'ck1' in request.COOKIES:
response.write('<h1>' + request.COOKIES['ck1'] + '</h1>')
return response
- 通过浏览器查看Cookie信息
Session
- Session以键值对的形式存储在服务端,键与Cookie中的
sessionid
相同,值是开发人员设置的键值对信息,进行了base64编码,过期时间由开发人员设置- 服务器会在Cookie中存储一个
sessionid
,浏览器每次请求时会将这个数据发给服务器,服务器根据收到sessionid
找出对应的Session数据- Session用于存储敏感的、重要的信息,如真实姓名、余额、等级、验证码等
对象及方法
通过HttpRequest
对象的session
属性进行会话的读写操作
- 以键值对的格式写session:
request.session['键']=值
- 根据键读取值:
request.session.get('键',默认值)
- 清除所有session中值部分:
request.session.clear()
- 清除整条session数据:
request.session.flush()
- 删除session中指定的键和值:
del request.session['键']
- 设置会话的超时时间(默认两星期):
request.session.set_expiry(value)
如果value是一个整数,会话将在value秒没有活动后过期。
如果value为0,那么用户会话的Cookie将在用户的浏览器关闭时过期。
如果value为None,那么会话永不过期。
实例演练: 写入Session
- 修改urls.py文件:
url(r'^session_write/$',views.session_write),
- 修改views.py文件:
def session_write(request):
request.session['s1'] = 'hello'
return HttpResponse('写session')
- 在调试工具中查看响应头中创建的Cookie,里面有个键为
sessionid
- 数据表
django_session
中也增加了相应记录
- 将数据表中的
seession_data
,在Base64解码中进行解码,结果如下图
实例演练: 读取Session
- 修改urls.py文件:
url(r'^session_read/$',views.session_read),
- 修改views.py文件:
def session_read(request):
s1 = request.session.get('s1')
return HttpResponse(s1)
- 在浏览器中查看结果
实例演练: 删除Session
def session_test(request):
del request.session['s1']
return HttpResponse('ok')
- end -
网友评论