首页 > 编程知识 正文

redis 设置过期时间,session过期时间在哪里设置

时间:2023-05-04 18:27:13 阅读:173731 作者:4364

1、session原理

cookie是保存在用户浏览器端的键值对

session是存储在服务器端的键值对

session服务端存在的数据如下。

session={

随机字符串1:{

用户1的相关信息

}

随机字符串2:{

关于用户2的信息

}

}

作为会话客户端的客户端的浏览器cookie中存储的数据是与当前用户相对应的随机字符串

2、session详细分析(是否过期、过期时间) ) ) ) ) ) ) ) ) )。

Session在我们做web项目时很常用,以前我不太在意,但这次我又仔细看了一下!

1.session其实是一个Map,它是一个键=值对,包含session.getattribute('name ); 获取在session中设定的参数

2.session的有效期是从什么时候开始计算的? 是一注册就开始计算,还是从停止活动开始计算?

a )从会话不活动时开始计算,如果会话一直活动,会话很难过期。

从该Session未被访问开始计时; 当Session被访问时,时间清零0;

3、会话工作过程

1、生成随机字符串

2、写在用户浏览器的cookie上

3、保存在会话中

4、设置与随机字符串对应的词典相关的内容

在Django中,上述过程如下。

request.session [ ' username ' ]=user

此处的username是在request.POST.get('username ' )中从前端html页面获取的用户名信息

注意:

要在Django上使用会话,请务必先执行:

python manage.py makemigrations

python manage.py migrate

用户登录后,session信息会记录在数据库的django_session表中

同样,也可以从request.session['username']中检索适当的值

在这个过程中:

1、首先获取当前用户的随机字符串

2、从随机字符串中获取对应内容

4、会话操作

如果request.session['k1']不存在,将报告错误

request.session.get['k1']如果不存在,则报告错误(request.session.get('k1 ',none ) ) ) ) )以避免错误。

设定request.session [ ' k1 ' ]=123 session值

request.session.setdefault('k1 ',123 )存在时不设定

del request.session['k1']删除

request.session.clear ()删除

所有键、值和键值对

request.session.keys (

request.session.values (

request.session.items (

request.session.iterkeys (

request.session.itervalues (

request.session.iteritems (

用户session的随机字符串

request.session.session_key

删除所有Session过期时间短于当前日期的数据

request.session.clear_expired (

检查数据库中是否存在用户session的随机字符串

request.session.exists (session _ key ) )。

删除当前用户的所有会话数据

request.session.delete (session _ key ) )。

5、设置会话超时时间

5.1、通过django设置

session _ cookie _ name=' session id ' # 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使用比较简单,在request.session是一个字典类。session是保存在数据库中的。

5.2、在views中的设置

request.session.set_expiry(value)

默认的过期时间是两周,如果自己设置了过期时间,这样自己设定的优先级就会高于默认的

如果value是个整数,session会在些秒数后失效。

如果value是个datatime或timedelta,session就会在这个时间后失效。

如果value是0,用户关闭浏览器session就会失效。

如果value是None,session会依赖全局session失效策略。

注意:

Django中设置session过期时间:

request.session.set_expiry(timedelta(days=30))

运行提示错误:TypeError: datetime.datetime(2018, 7, 3, 7, 36, 57, 636224, tzinfo=) is not JSON serializable

解决办法:

在setting中添加:

SESSION_SERIALIZER='django.contrib.sessions.serializers.PickleSerializer'

6、Django中对于session的存储方式

Django中支持session,其中内部提供了5种类型的session供开发者使用:

数据库(默认)

缓存

文件

缓存+数据库

加密cookie

1、如果是数据库,需要在settings.py中配置如下:

SESSION_ENGINE = 'django.contrib.sessions.backends.db' (引擎(默认))

2、如果是缓存session,需要在settings.py中配置如下:

SESSION_ENGINE = 'django.contrib.sessions.backends.cache'(引擎)

SESSION_CACHE_ALIAS= 'default'  使用的缓存别名(默认内存缓存,也可以是memcache),此处别名依赖缓存的设置

1、    如果是文件session, 需要在settings.py中配置如下:

SESSION_ENGINE = 'django.contrib.sessions.backends.file' (引擎)

SESSION_FILE_PATH=None  缓存文件路径,如果为None,则使用tempfile模块获取一个临时地址tempfile.gettempdir()

2、    如果是缓存+数据库session,需要在settings.py中配置如下:

SESSION_ENGINE='django.contrib.sessions.backends.cached_db'       (引擎)

7、session的过期判断;

1)  以前是根据 if(session.getAttribute('user')==null)判断是否为空

=========================================================================================

2) 如下为看到的一个帖子,判断session不为空的好方法:

request.getSeesion(boolean)方法,一下子让我恍然大悟。这个方法里面传了一个boolean值,这个值如果是true,那么如   果当前的request的session不可用,那么就创建新的会话,如果存在就返回当前的会话。如果参数是false,那么在request的当前会话不存在的时候就返回null。

这样我们就可以很容易的联想到这个所谓的request的当前会话是否存在和session过期的联系,所以我们就可以“近似地”认为session不存在就是session过期了,那么我们就可以很容易地判断session是否过期了。方法如下:

if(request.getSession(false)==null){

System.out.println("Session has been invalidated!");

}

else{

System.out.println("Session is active!");

}

可能大家注意到我上面有一个“近似地”字眼,也就是说存在特别情况。

这个特殊情况就是第一次请求还没有创建会话的时候,那么用这个方法返回的仍然是null

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。