torando+session+pycket 做登录保持以及时间续租 作者: jlb 2019年11月20日  要做torando的登录状态保持 要做torando的登录状态保持,当用户一点时间没有操作时用户退出登录(清除客户端保存的cookie), 当用户对后台访问时重置cookie保存时间将用户登录续租。 ### pycket配置 我用的是redis做的登录保持,我的配置如下 ```python pycket={ "engine": "redis", # 配置存储类型 "storage": { "host": "localhost", "port": 6379, "db_sessions": 5, "db_notifications": 11, "max_connections": 2 ** 31 }, "cookies": { "expires_days": 30, "max_age": 60 * 60 * 12, } }, ``` ### 其他需要改的地方 1. 项目虚拟环境下的或者在from pycket.session import SessionMixin 2. 更改源码 1. 更改SessionMixin类中的get函数添加每次查询的时候重新向数据库中保存一遍已有的session数据防止redis数据过期 ```python def get(self, name, default=None): ''' Gets the object for "name", or None if there's no such object. If "default" is provided, return it if no object is found. ''' session = self.__get_session_from_db() if session: for s_k, s_v in session.items(): self.set(s_k, s_v) return session.get(name, default) ``` 2. 修改cooker的过期时间: 向cookie中写入PYCKET_ID的函数只找到` __create_session_id`函数中有调用 在get函数中获取session调用`__get_session_from_db()`函数获取该函数获取通过`__get_session_id获取session_id` 在`__get_session_id`函数中首先获取cookie中的`PYCKET_ID`为`session_id`如果没有则通过`__create_session_id`向cookie中添加`PYCKET_ID`作为登录保持的票据 所以修改源码如下 ```python def __get_session_id(self): session_id = self.handler.get_secure_cookie(self.SESSION_ID_NAME) # if session_id is None: session_id = self.__create_session_id(session_id) return session_id def __create_session_id(self, session_id=None): if not session_id: session_id = str(uuid4()) self.handler.set_secure_cookie(self.SESSION_ID_NAME, session_id, **self.__cookie_settings()) return session_id ``` 每次获取时将session_id传入`__create_session_id`,作为cookie的值,如果session_id 为None时通过str(uuid4())产生一个uuid作为cookie值保存在客户端。 错误之处欢迎指出 (版本不同可能有部分不太一样)