django_session表
在项目中,Django默认情况下会将session中的数据保存到django.contrib.sessions.models.Session模型类对应的django_session表中。Django为我们这样处理虽然很方便,但是性能会不如我们直接将session会话保存在缓存(memcached)中,这个在文章最下面提到了相关配置。
从上面我们可以发现,django.contrib.sessions其实是我们项目中Django内置的应用,它提供了session相关的功能,因此当这个app添加到配置文件的INSTALLED_APPS下才会生效
django_session表中的字段
session_key 对应sessionid值
iwt391t9tnrr02ibn1zjog564b7g3zmi
session_data 客户端发送的信息(被加密)
session_date 过期时间(datatime格式)
2019-11-15 07:03:05.268634
定期清理无效的session!
使用django-admin clearsessions
request.session
session相关配置
只有当配置文件中的SessionMiddleware激活的时候,每一个HttpRequest才会有一个session属性,request.session是一个类字段对象
request[key] = value
session中key对应的value应该是客户端提交的信息(比如用户名,性别,年龄等在上下文中可能用到的数据)
在配置文件中设置session
将key作为配置项添加到项目的settings.py文件目录下,比如ZIAWANG = “userInfo”
在views.py文件中需要该配置项验证session的时候,我们可以通过导入settings.py文件来调用配置项。但是要注意的是,我们应该导入django.conf包下的settings.py,,因为这个settings.py包含了项目名目录下的settings.py,而且通过该配置文件,我们可以获取更多的配置选项
from django.conf import settings
userInfo = request.session.get(settings.ZIAWANG)
if not userInfo:
return redirect('/login/')
request.session.setdefault()
查看Session
request.session[key] (注意小写)
不推荐这种方式获取session中的值,因为当key不存在的时候,会报错。
request.session.get(key, default=None)
返回session中key对应的value,如果key不存在,就会返回default设置的值
判断某个key是否在session中
使用in
if not 'userinfo' in request.session:
return redirect("/login/")
request.session.keys()
request.session.items()
删除Session
request.session.pop(key)
返回session中对应的key,并将其从session中删除
del request.session[key]
删除的是客户端保存在服务端上的信息
request.sesion.clear()
request.session.flush()
删除当前会话数据并删除会话cookie,删除Djangosession表中的一条记
session有效时间
设置有效时间
request.session.set_expired(value) value 整数: 单位为秒,表示在value秒之后session失效
datetime对象: 会在datetime指定时间之后失效
0: 关闭浏览器之后就失效
None: 依赖全局的session失效策略配置
清除有效时间
request.session.clear_expired()
查看有效时间
request.session.get_expiry_age()
request.session.get_expiry_date()
session会话序列化
默认情况下,Django会将session会话中的数据进行json序列化,尽量不要用Pickle,因为这样容易受到攻击
看官方的一个例子
>>> # initial assignment
>>> request.session[0] = 'bar'
>>> # subsequent requests following serialization & deserialization
>>> # of session data
>>> request.session[0] # KeyError
>>> request.session['0']
'bar'
session的应用
1.登陆验证
2.存放用户数据
3.保存用户状态 比如不允许用户多次评论时,可以在session中保存一个状态变量
def post_comment(request, new_comment):
if request.session.get('has_commented', False):
return HttpResponse("You've already commented.")
c = comments.Comment(comment=new_comment)
c.save()
request.session['has_commented'] = True
return HttpResponse('Thanks for your comment!')
如何验证客户端浏览器是否接收Cookie
request.session.test_cookie_worked()
如果客户端支持cookie,就返回True
request.session.delete_test_cookie
删除哟关于测试的cookie,一般在测试成功之后使用
request.session.set_test_cookie()
设置客户端的Cookie
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存储的相关配置
数据库配置(默认)
# settings.py
SESSION_ENGINE = 'django.contrib.sessions.backends.db' # 引擎(默认)
SESSION_COOKIE_NAME = "sessionid" # Session的cookie保存在浏览器上时的key,即:sessionid=随机字符串(默认)
SESSION_COOKIE_PATH = "/" # Session的cookie保存的路径(默认)
SESSION_COOKIE_DOMAIN = None # Session的cookie保存的域名(默认)
SESSION_COOKIE_SECURE = False # 是否Https传输cookie(默认)
SESSION_COOKIE_HTTPONLY = True # 是否Session的cookie只支持http传输(默认)
SESSION_COOKIE_AGE = 1209600 # Session的cookie失效日期(2周)(默认)
SESSION_EXPIRE_AT_BROWSER_CLOSE = False # 是否关闭浏览器使得Session过期(默认),优先级高于SESSION_COOKIE_AGE
SESSION_SAVE_EVERY_REQUEST = False # 是否每次请求都保存Session,默认修改之后才保存(默认),即每一次对网站的请求都会刷新Cookie有效时间
缓存配置(redis)
缓存中存储数据有两种选择 简单的缓存会话存储SESSION_ENGINE = ‘django.contrib.sessions.backends.cache’ 缓存填满或者缓存服务器重启的时候缓存session就会被清理掉
持久的缓存会话存储SESSION_ENGINE = ‘django.contrib.sessions.backends.cached_db’
## settings.py
SESSION_ENGINE = 'django.contrib.sessions.backends.cache' # 引擎,用于简单的缓存会话存储
SESSION_CACHE_ALIAS = 'default' # 使用的缓存别名(默认内存缓存,也可以是memcache),此处别名依赖缓存的设置
SESSION_COOKIE_NAME = "sessionid" # Session的cookie保存在浏览器上时的key,即:sessionid=随机字符串
SESSION_COOKIE_PATH = "/" # Session的cookie保存的路径
SESSION_COOKIE_DOMAIN = None # Session的cookie保存的域名
SESSION_COOKIE_SECURE = False # 是否Https传输cookie
SESSION_COOKIE_HTTPONLY = True # 是否Session的cookie只支持http传输
SESSION_COOKIE_AGE = 1209600 # Session的cookie失效日期(2周)
SESSION_EXPIRE_AT_BROWSER_CLOSE = False # 是否关闭浏览器使得Session过期
SESSION_SAVE_EVERY_REQUEST = False # 是否每次请求都保存Session,默认修改之后才保存
文件配置
# settings.py
SESSION_ENGINE = 'django.contrib.sessions.backends.file' # 引擎
SESSION_FILE_PATH = None # 缓存文件路径,如果为None,则使用tempfile模块获取一个临时地址tempfile.gettempdir()
SESSION_COOKIE_NAME = "sessionid" # Session的cookie保存在浏览器上时的key,即:sessionid=随机字符串
SESSION_COOKIE_PATH = "/" # Session的cookie保存的路径
SESSION_COOKIE_DOMAIN = None # Session的cookie保存的域名
SESSION_COOKIE_SECURE = False # 是否Https传输cookie
SESSION_COOKIE_HTTPONLY = True # 是否Session的cookie只支持http传输
SESSION_COOKIE_AGE = 1209600 # Session的cookie失效日期(2周)
SESSION_EXPIRE_AT_BROWSER_CLOSE = False # 是否关闭浏览器使得Session过期
SESSION_SAVE_EVERY_REQUEST = False # 是否每次请求都保存Session,默认修改之后才保存
数据库 + 缓存配置