状态保持:
- http协议是无状态的:每次请求都是一次新的请求,不会记得之前通信的状态
- 客户端与服务器端的一次通信,就是一次会话实现状态保持的方式:在客户端或服务器端存储与会话有关的数据
- 存储方式包括cookie、session,会话一般指session对象
- 使用cookie,所有数据存储在客户端,注意不要存储敏感信息
- 使用sesison方式,所有数据存储在服务器端,在客户端cookie中存储session_id
- 状态保持的目的是在一段时间内跟踪请求者的状态,可以实现跨页面访问当前请求者的数据
- 注意:不同的请求者之间不会共享这个数据,与请求者一一对应
Cookie保存用户信息
- views.py
class homeView(View):
def get(self, request):
# 获取请求中的Cookie
num = request.COOKIES.get('num')
if num:
num = int(num)+1
else:
num = 1
# 构造返回数据
response = render(request, 'home/index.html', locals())
# cookie中设置num 返回给客户端浏览器, 过期时间为10s
response.set_cookie('num', num, max_age=10)
return response
- urls.py
urlpatterns = [
path('home/', views.homeView.as_view(), name='home')
]
- home.html
我是 第{{ num }} 次访问
-
展示
-
缺点,用户客户端可以修改
Session保存用户信息
- 可以理解为 sessionid 是客户端随机生成的唯一的 key值,保存在cookie中,
- 服务器session中保存着很多键为 sessionid 值为userinfo的字典,
- 客户端和服务器通过session_id交流
-
启用
- 方法
启用会话后,每个HttpRequest对象将具有一个session属性,它是一个类字典对象
- get(key, default=None):根据键获取会话的值
- clear():清除所有会话
- flush():删除当前的会话数据并删除会话的Cookie
- set_expiry(value):设置会话的超时时间
- 如果没有指定,则两个星期后过期
- 如果value是一个整数,会话将在values秒没有活动后过期
- 若果value是一个imedelta对象,会话将在当前时间加上这个指定的日期/时间过期
- 如果value为0,那么用户会话的Cookie将在用户的浏览器关闭时过期
- 如果value为None,那么会话永不过期
- settings.py 配置(可以不设置,保持默认)
# 是否关闭浏览器使得session过期,默认是False
SESSION_EXPIRE_AT_BROWSER_CLOSE = False
# 是否每次请求都保存session,默认修改之后才保存
SESSION_SAVE_EVERY_REQUEST = False
# session的cookie失效日期,默认是2周
SESSION_COOKIE_AGE = 1209600
- views.py
class homeView(View):
def get(self, request):
name = request.session.get('name')
return render(request, 'home/index.html',locals())
class LoginView(View):
def get(self,request):
return render(request,'login/login.html')
def post(self, request):
username = request.POST.get('username','')
password = request.POST.get('password','')
if username == 'liuwei' and password == '123456':
# 设置值
request.session['name'] = username
request.session.set_expiry(10)
return redirect(reverse('index:home'))
class LogoutView(View):
def get(self, request):
request.session.flush()
return redirect(reverse('index:home'))
- urls.py
path('home/', views.homeView.as_view(), name='home'),
path('login/', views.LoginView.as_view(), name='login'),
path('logout/', views.LogoutView.as_view(), name='logout'),
-
展示
算法加密
- 加盐,时间戳,等等