标题:django sesssion framework | 作者: catfish | 时间:2020年01月08日
暂无法显示图片

启用会话

django中会话的启用基于中间件:'django.contrib.sessions.middleware.SessionMiddleware'。默认情况下创建站点时该中间件已启用。

配置会话引擎

默认情况会储存到数据库中,尽管很方便,但是将会话数据储存在其他位置更快。因此可以将Django配置在文件系统或缓存会话数据。

基于数据库的会话

把'django.contrib.session'添加到INSTALL_APP中。配置完成后安装系统表:python3 manage.py migrate。

基于缓存的会话

先配置缓存方式。在再添加SESSION_ENGINE参数并选择’django.contrib.sessions.backends.cache’(缓存)或者’django.contrib.sessions.backends.cached_db’(高速缓存),如果涉及到多个缓存(CACHES),就配置SESSION_CACHE_ALIAS来写它的名字。默认是'default'。与缓存相关详情请参考django缓存

基于文件的会话

SESSION_ENGINE配置为"django.contrib.session.backends.file",同时你需要设置SESSION_FILE_PATH来设置文件目录。请确保您的web服务器是否有读写此位置的权限。

基于cookie的会话

SESSION_ENGINE设置为"django.contrib.sessions.backends.signed_cookies"。会话数据将由加密签名SECRET_KEY进行储存。(SESSION_COOKIE_HTTPONLY默认为True,表示客户端Javascript无法访问会话cookie。推荐为True来提高安全性。)注意:cookie的大小会影响网站的速度。

在视图中使用会话

JSONSerializer

默认设置,设置SESSION_SERIALIZER = ‘django.contrib.sessions.serializers.JSONSerializer’(默认值)
request.session是一个可以读写全局有效的类字典。字典的键必须是字符串,如果不是会自动转换为字符串。

>>> request.session[0] = 'bar'
>>> request.session[0]            # KeyError
>>> request.session['0']
'bar'

PickleSerializer

设置SESSION_SERIALIZER = 'django.contrib.sessions.serializers.PickleSerializer'
这个可以储存任意的python对象。不过如果攻击者知道SECRET_KEY,则会导至远程执行代码漏洞。

如何选择?、

尽管JSONSerializer不能处理任意的Python数据类型。但是它比较安全。而且只需向使用python字典一样使用request.session即可,不要用新对象覆盖,也不需要设置其属性。以下划线开头的会话字典键保留Django内部使用。

在测试session使用的代码

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')

在shell中使用session

>>> from django.contrib.sessions.backends.db import SessionStore
>>> s = SessionStore()
>>> s['last_login'] = 1376587691
>>> s.create()                                     # 这里也可以用save()
>>> s.session_key
'2b1189a188b44ad18c35e113ac6ceead'
>>> s = SessionStore(session_key='2b1189a188b44ad18c35e113ac6ceead')
>>> s['last_login']
1376587691

调用save()新会话也可能有效,但是产生session_key与现有会话冲突的机会很小。create() 调用save()并循环,直到session_key生成未使用的。简而言之,推荐年用create方法,也可以用save方法。创建的值保存在Session中。Session的表为:

class DjangoSession(models.Model):
    session_key = models.CharField(primary_key=True, max_length=40)
    session_data = models.TextField()                               # 键值对以加密形式储存
    expire_date = models.DateTimeField()

    class Meta:
        managed = False
        db_table = 'django_session'

根据sesion原表分析。第一个数据字段是主键,第二个字段是编码加密形式的键值对,第三个字段是过期时间。

使用这个表如下:

>>> from django.contrib.sessions.models import Session
>>> s = Session.objects.get(pk='2b1189a188b44ad18c35e113ac6ceead')
>>> s.expire_date
datetime.datetime(2005, 8, 20, 13, 35, 12)
>>> s.session_data                                           # 加密后的数据
'KGRwMQpTJ19hdXRoX3VzZXJfaWQnCnAyCkkxCnMuMTExY2ZjODI2Yj...'
>>> s.get_decoded()                                         #获取未加密的数据 
{'user_id': 42} 

设置会话过期时间

SESSION_EXPIER_AT_BROWSER_CLOSE默认设置为False。表示用户关闭浏览器是否会话到期。SESSION_COOKIE_AGE表示浏览器中cookie将在浏览器中保存的时间最长为SESSION_COOKIE_AGE,秒为单位,默认时间为两周。如果您希望人们每次打开浏览器都必须登录,请使用此功能。

清除过期会话

python3 manage.py clearsessions

总结

request.session作为键值对使用。其他的设置可以参照进行。

我要评论

没有登录?请先登录后再评论

最新评论

暂无人评论,来抢个沙发吧!