Django(Session操作)

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,默认修改之后才保存

数据库 + 缓存配置

session与中间件配合使用

  • 3
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值