http状态保持:首先要知道HTTP请求是无状态的,每完成一次请求就失效,客户端每次发送请求到服务端就是一次会话
想要实现会话保持就需要在客户端或者服务端完成状态数据存储和调用。可以通过cookie和session两种方法存储
cookie:把数据存储在客户端,不建议存储敏感数据,一般客户端只存储一个:session_id
session:把数据存储在服务端并保存一定的时间,
不管是cookie和session,在不同的用户之间都不会共享数据。
username = '123'
request.session['name'] = username
request.session.set_expiry(5)
print(request.session.get('name'))
session字段:session_key session_data expire_date
# 1.启用session
settings.py --> INSTALLED_APPS --> 'django.contrib.sessions', # 一般默认启用
settings.py --> MIDDLEWARE --> 'django.contrib.sessions.middleware.SessionMiddleware', # 一般默认启用
# 2.使用session
启用后在HttpRequest对象中会有session属性:一个键值对对象
get(key, default=None) # 根据键取session值,如果没有取到session值就是default
clear() # 清空所有会话
flush() # 删除当前会话和会话cookie
演示
静态页面1:login_index.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>首页</title>
</head>
<body>
<h2>欢迎{{ username }}光临python自学网</h2>
<a href="/login/">登陆</a>
</body>
</html>
静态页面2:login.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>注册</title>
</head>
<body>
<div>
<form action="/login_ok/" method="post">
<!-- 用户名 -->
<div>
<input type="text" name="username" id="username" placeholder="请输入您的昵称">
</div>
<!-- 密码 -->
<div>
<input type="password" name="password" placeholder="输入密码" id="password">
</div>
<!-- 提交 -->
<div>
<button type="submit" name="submit" value="立即登录" id="submit">立即注册</button>
</div>
</form>
</div>
</body>
</html>
urls.py:
url(r'^login_index/$', views.login_index),
url(r'^login/$', views.login),
url(r'^login_ok/$', views.login_ok),
url(r'^quit/$', views.quit),
views.py:
def login_index(request):
# 获取session值,如果没有值就显示xx
username = request.session.get('name', 'xx') # 注意这里的name是从session取来的
return render(request, 'session/index.html', {'username': username})
def login(request):
return render(request, 'session/login.html')
def login_ok(request):
username = request.POST.get('username')
request.session['name'] = username # 把username作为name的值存入session
request.session.set_expiry(5) # 设置session5秒后过期,0表示关闭浏览器失效,None表示永不失效
return redirect(to='/login_index/')
def quit(request):
# 退出登陆
request.session.flush() # 退出登陆,保留缓存到数据库
# 注销登陆
request.session.clear() # clear()是将缓存全部清空
return redirect('session/index.html')
del request.session[''] # 值删除值
request.session.delete('') # 删除当前会话的所有Session数据