网络上的任何交互都是基于socket连接
http 连接响应 close 再次连接 无法确实是否还是xx的连接——无状态,短连接
以博客园举例 无状态和短连接:
for example:
Web应用(网站):
浏览器(socket客户端)运行
2.发送请求
博客园为例子 (socket服务端)
- 监听自己的ip和端口 { cmd中Ping+网址可在终端拿到(ip) }
While Ture:
3.收到 请求
4.响应
用户断开
#################################################
关于cookies和session的总结(ps:不是很全)
1. http协议的无状态性:
使用cookie:
第一次向服务器发起请求,服务器返回一个cookie给客户端,
客户端存储cookie,当客户端再次发起请求时携带cookie信息给服务器,
服务器接收到cookie信息能够获取用户信息
不使用cookie:
第一次向服务器发起请求,服务器返回一个响应给客户端
第二次再次向服务器发起请求,服务器仍然不知道是哪一个用户发起的请求
2. 使用cookie可以弥补这种http请求的无状态性
1. 客户端发起请求(包含用户信息),服务器接收到请求,验证用户信息,同时返回响应给客户端(携带cookie)
2. 客户端接收响应(存储cookie)
3. 客户端再次发起请求就会携带cookie信息,服务器就能知道是哪个用户发起的请求了
【注意】:
1. cookie不能跨域传递
2. 使用cookie存储数据的容量是有限的, 不能使用cookie存储大量文本信息。
一般来说用cookie存储用户名, sessionid
不同的浏览器, cookie容量不同,最大不会超过4kb
3. 在django中操作cookie
1. 设置cookie
p = HttpResponse()
p.set_cookie(key, value) # 默认过期时间: 浏览器关闭时,不是标签页关闭
p.set_cookie(key, value, max_age=60) # 单位是秒, 设置过期时间
from django.utils.timezone import make_aware
带时区的时间日期对象 = make_aware(时间日期对象)
p.set_cookie(key, value, expires=时间日期对象(带时区))
* 如果同时设置了max_age和expires, 则使用expires的过期时间
2. 删除cookie
p = HttpResponse()
p.delete_cookie('name')
3. 获取cookie
request.COOKIES.get('name')
POST
GET
FILES
PS:(
cookie是保存在客户端的(浏览器)
cookie在客户端中分域名保存
发起请求时客户端自动将当前域名(路劲)下未过期的cookie携带上
)
4. session
1. 基于cookie实现
2. 过程:
1. 客户端发起请求(用户信息), 服务器接收到请求,
验证通过, 将用户信息加密后存储到session表中,对应着随机生成的session_id
2. 服务器返回响应, 携带cookie, cookie中存储的是session_id
3. 客户端接收到响应, 存储cookie信息到本地浏览器中
4. 客户端再次发起请求, 携带cookie信息(session_id),
服务器接收到请求后,通过session_id就能获取用户信息
注意: cookie存储在客户端(浏览器)
session存储在服务器
5. 在django中操作session
1. 存储:
request.session['key'] = 'value'
同一个用户,创建多个session键值对,在django_session表中只存储为一条session数据;
session表中的session_key是固定的。
2. 获取:
request.session[]
request.session.get()
request.session.items()
request.session.keys()
request.session.values()
3. 删除:
request.session.pop('key')
4. 清除数据:
request.session.clear() # 清除当前用户存储的session键值对,session表中的session数据还在
cookie中仍然有session_id的值
request.session.flush() # 注销;退出登录;
在session表中删除当前用户的整条session数据,
cookie中的session_id也被删除了
* 同一个客户端的同一个用户也可能会产生多条session表中的数据,因为之前的数据都过期了
5. 删除过期的session
1. 代码 request.session.clear_expired()
2. 命令行 python manage.py clearsessions
6. 设置过期时间
request.session.set_expiry()
1. 整型参数: 秒
2. 0:浏览器关闭
3. None:默认的过期时间,2周
settings.py
TIME_ZONE = 'Asia/Shanghai'
USE_TZ = False