python3 web框架的简单会话实现

redis-session的Python项目详细描述


redis会话

使用redis store实现web会话

PYPI VersionBuild Status

说明

为python3 web框架实现,以处理客户端会话(支持tornado和flask,稍后支持其他web框架),使用redis散列保存会话数据。

  • 为了控制会话的过期,我们使用redis密钥过期,并且只在服务器/数据库端控制会话过期,而在会话id中使用secure cookies的默认过期时间。

  • 读取请求中的会话数据将导致每个请求重置会话过期时间。修改会话数据将导致每次修改重置一次。

  • 请指定cookie_secretSECRET_KEY用于烧瓶),因为我们正在使用安全的cookie密钥。

  • 直接从redis获取会话属性可以避免读取过时的数据。因此,当不需要时,复制数据而不是再次读取,这意味着:

(Example of tornado)
# Do this
name = self.session.name.str
names.append(name)
self.session.name = make_new_name(name)
# Instead of (When we are not worried about conflicts with other processes/threads)
names.append(self.session.name.str)
self.session.name = make_new_name(self.session.name.str)  # This will read name from redis again

设置和安装

通过PIP
pip install redis_session

源代码

python setup.py build && python setup.py install

会话数据分析

我们提供了常用的redis结果解析方法。例如:

# Get raw bytes
self.session.name.raw         # b'stefan'

# Parsing to types
self.session.name.str         # Fallback to ''
self.session.count.int        # Fallback to 0
self.session.vip.bool         # Fallback to False
self.session.properties.json  # Fallback to {}

# Check if is none
self.session.age.none

龙卷风

  • 我们正在使用TORNADO.OPTIONS模块,请在开始时在下面运行一次。
tornado.options.parse_command_line()
# or
tornado.options.parse_config_file("/etc/server.conf")

命令行参数

# For tornado users
define('session-redis', default='redis://localhost:6379', help='session store redis url', type=str)
define('session-redis-prefix', help='redis key prefix', type=str)
define('session-expire', help='session ttl(seconds)', type=int)
define('session-cookie-id', help='cookie key, default: session-id', type=str)
define('session-cookie-secure', default=True, help='if use secure session cookie', type=bool)
define('session-cookie-domain', default='', help='session cookie domain', type=str)
define('session-cookie-path', default='/', help='session cookie path', type=str)
define('session-cookie-http-only', default=True, help='if set session cookie as http only', type=bool)

示例

# With tornado framework

import tornado.web
import tornado.httpserver
import tornado.ioloop
from tornado.options import options, define, parse_command_line
from redis_session.tornado_session import SessionHandler

define('port', default=3000, help='run on the given port', type=int)
define('debug', default=False, help='run in debug mode')

class MainHandler(SessionHandler):
    def get(self):
        count = self.session.count.int
        self.write(f'Current session value of count:{count}\n')
        self.session.count = count + 1
        self.write(f'Current session value of count:{self.session.count.int}\n')

def main():
    parse_command_line()
    application = tornado.web.Application([(r'/', MainHandler)], cookie_secret='udxas-efasx-ase323fs-3efsxf3eFdes')
    http_server = tornado.httpserver.HTTPServer(application)
    http_server.listen(options.port)
    tornado.ioloop.IOLoop.instance().start()

if __name__ == '__main__':
    main()

烧瓶

请注意,烧瓶会话cookie的httpOnly在该项目中尚未得到很好的实现。

示例

from redis_session.flask_session import setup_session
from flask import Flask, request

app = Flask(__name__)

@app.route('/')
def handle():
    count = request.session.count.int
    res = f'Current session value of count:{count}\n'
    request.session.count = count + 1
    res += f'Current session value:{request.session.count.int}\n'
    return res


def main():
    app.config.from_mapping(
        ENV='dev',
        SECRET_KEY='demo',
        SESSION_REDIS='redis://localhost:6379',
        SESSION_REDIS_PREFIX='appName',
        SESSION_COOKIE_ID='app-session-id',
        SESSION_COOKIE_HTTP_ONLY = True,
        SESSION_COOKIE_SECURE = False,
        SESSION_COOKIE_DOMAIN = '.mydomain.com',
        SESSION_COOKIE_PATH = '/',
        SESSION_EXPIRE=60*60*24*7
    )
    setup_session(app)
    app.run(port=3000)

if __name__ == "__main__":
    main()

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
JavaEclipse巨大的CPU峰值   java如何修复错误“上次成功发送到服务器的数据包是0毫秒前的。驱动程序尚未从服务器接收到任何数据包”   Java算法的C等价加密   java jackson序列化程序在禁用注释时引发NullPointerException   java制作了一种使用星星创建X为正方形的图像的方法   java软键盘切断了EditText/TextInputText控件的底部   java如何在jboss eap 7.3上启用cors?   摆动Java排列不规则形状   java逻辑Maven版本编号   在JShell中,如何评估整个java代码?   servlets对Java war文件进行签名并包含清单是有效的。MF在<warroot>/METAINF中   java在JTable中添加背景图像   java未收到来自服务器的响应   java解析Weblogic依赖项在编译时工作正常,但在运行时失败   带有两个Android应用程序模块的java Gradle项目   java有没有一种方法可以编写一个执行预定义手势和动作的应用程序?   java为什么finish()使所有活动都不能返回到以前的活动?   选项卡窗格的Java Swing makeTextPanel()方法