Django为匿名会话提供全面支持。 会话框架允许您基于每个站点访问者存储和检索任意数据。
安装
session 通过中间件实现的
app:django.contrib.sessions
middleware:django.contrib.sessions.middleware.SessionMiddleware
配置
- 数据库
- 默认方便
- 缓存
- 表现更好,要配置了缓存
- 文件
- cookie
- django.contrib.sessions.backends.signed_cookies 签名加密
View里使用
session 激活后,所有 request 都有 session 属性;如字典,可任意读写。
backends.base.SessionBase
方法:
- get(key, default=None)
- pop(key, default=None)
- keys()
- items()
- setdefault()
- clear()
session 序列化
默认 JSON serializers.JSONSerializer
若用 pickle serializers.PickleSerializer
,SECRET_KEY 泄露会很危险。
一些准则
- 只用 str 作为 key
- 下划线开头的不可以(被保留了)
- 只读不写
用例
login 增加会话
def login(request):
m = Member.objects.get(username=request.POST['username'])
if m.password == request.POST['password']:
request.session['member_id'] = m.id
return HttpResponse("You're logged in.")
else:
return HttpResponse("Your username and password didn't match.")
logout 删除会话
def logout(request):
try:
del request.session['member_id']
except KeyError:
pass
return HttpResponse("You're logged out.")
检测客户端是否使能 cookies
典型用法
from django.http import HttpResponse
from django.shortcuts import render
def login(request):
if request.method == 'POST':
if request.session.test_cookie_worked():
request.session.delete_test_cookie()
return HttpResponse("You're logged in.")
else:
return HttpResponse("Please enable cookies and try again.")
request.session.set_test_cookie()
return render(request, 'foo/login_form.html')
何时session保存
仅当 session 的值添加或删除或修改时,session 保存。
但是request.session['foo']['bar'] = 'baz'
这种修改值的属性不会保存。要手动标记成已修改
request.session.modified = True
。
清理session储存
不清理的话,存session的数据表或文件夹会越来越大。
cache 不会,会自动清理。
清理命令 clearsessions