用于django.contrib.sessions的基于redis的django会话引擎。

django-redisession的Python项目详细描述


用于django.contrib.sessions的基于redis的django会话引擎。

此引擎支持将会话数据存储为redis字符串,或将会话分发到redis散列以更有效地使用redis存储(redis服务器上没有太多额外的cpu开销)。refs http://antirez.com/post/redis-weekly-update-7.htmlhttp://redis.io/topics/memory-optimization,您可能需要调整redis conf以供实际使用。该技术在下面称为散列模式)。

安装

  1. 需要django版本>;=1.3
  2. pip install django-redisession或在源python setup.py install中。
  3. redisession添加到当前设置文件中已安装的应用程序。
  4. 在设置文件中设置SESSION_ENGINE='redisession.backend'

配置

django重新发布的配置选项可以放在dictREDIS_SESSION_CONFIG
  • SERVER–如果设置为dict,则该值将用作redis.redis()的参数,以生成redis连接实例。如果设置为一个字符串,那么Django将得到一个用于查找现有连接实例中的值,如下所示。
  • USE_HASH–如果设置为true(散列模式),django重新会话将把会话存储为redis散列的项。HASH_KEY_GENERATOR将用于生成相应的redis密钥。如果设置为false,会话的数据将存储为由KEY_GENERATOR生成的redis键的redis字符串值。MD5生成的会话密钥的分发不如SHA1生成的会话密钥,但仍然可以接受。
  • KEY_GENERATOR–在哈希模式下为会话生成redis密钥或redis哈希字段名的调用。callable接受session_key作为唯一参数。默认值从会话密钥(通常是十六进制字符串)生成二进制字符串,MD5为16字节。注意如果您正在自定义它,请打开LOG_KEY_ERROR,然后运行测试./manage.py test redisession,以“确保”KEY_GENERATOR与会话密钥一起工作。对于传入的django 1.5中包含“0-9a-z”的会话密钥,可以在redisession/backend.py中检查注释。
  • HASH_KEY_GENERATOR–在哈希模式下,为redis散列生成redis密钥的可调用项。默认值使用会话密钥二进制字符串的前两个字节,因此将会话分发到65536哈希。其他调度逻辑或密钥前缀可以通过自定义此选项来实现。注意如果您正在自定义它,请打开LOG_KEY_ERROR,然后运行测试./manage.py test redisession,以“确保”HASH_KEY_GENERATOR与会话密钥一起工作。对于传入的django 1.5中包含“0-9a-z”的会话密钥,可以在redisession/backend.py中检查注释。
  • HASH_KEYS_CHECK_FOR_EXPIRY–可以在哈希模式下生成redis密钥以检查是否删除过期会话。callable接受redis连接实例作为参数。默认值将redis.randomKey应用100次以采样关键点。
  • COMPRESS_LIB–用于压缩会话数据的压缩库的模块名,留空可禁用压缩。默认为'snappy',refssnappypython-snappy。压缩库应该支持压缩和解压缩,如zlib、lzo等。一个慢的库可能具有更高的压缩比,这意味着web服务器上的负载更高,但在与redis通信时IO更少。所以你要权衡一下。
  • COMPRESS_MIN_LENGTH–要尝试压缩的会话数据的最小长度。默认为400。
  • LOG_KEY_ERROR–日志键错误是由错误键引起的还是由配置错误引起的HASH_KEY_GENERATOR还是KEY_GENERATOR。默认为false。

示例:

# default: distributes sessions to 65536 Redis Hashes,
#          use binary string form of session_key,
#          applys Redis.randomkey 100 times to sample hash keys
#           to check for deleting expired session,
#          try to compress data (length >= 400) by using snappy.
REDIS_SESSION_CONFIG = {
    'SERVER': {},
    'USE_HASH': True,
    'KEY_GENERATOR': lambda x: x.decode('hex'),
    'HASH_KEY_GENERATOR': lambda x: x[:4].decode('hex'),
    'HASH_KEYS_CHECK_FOR_EXPIRY': lambda r: (reduce(lambda p,y :p.randomkey(),
        xrange(100), r.pipeline()).execute()),
    'COMPRESS_LIB': 'snappy',
    'COMPRESS_MIN_LENGTH': 400,
    'LOG_KEY_ERROR': False
}
# use session thru Redis get/set. store session key just as it is, hex string.
REDIS_SESSION_CONFIG = {
    'USE_HASH': False,
    'KEY_GENERATOR': lambda x: x
}
# almost as above, but add key prefix 's:' for Redis keys
REDIS_SESSION_CONFIG = {
    'USE_HASH': False,
    'KEY_GENERATOR': lambda x: 's:'+x
}
# use Redis connection instance through redisession.helper.get_redis
# here django-redisession will try to use Redis connection instance 'foo'
REDIS_SESSION_CONFIG = {
    'SERVER': 'foo'
}

# see following
REDIS_CONFIG = {
    'default': {'db':1},
    'foo': {'db':2, unix_socket_path='/tmp/bar'}
}
# Here are some other possible settings of 'HASH_KEYS_CHECK_FOR_EXPIRY'

# Fetching and scaning ALL keys and ALL of their fields. Use with caution.
lambda r: r.keys()

# Sampling 100 hash keys out of 65536 possible slots.
# This is useful if the number of actually used slots is closer to 65536.
lambda r: (map(lambda x:('%04x'%x).decode('hex'),
    random.sample(xrange(65536), 100)))

可以使用redisession.helper.get_redis按名称创建和获取全局redis连接实例。首先,在设置文件中设置REDIS_CONFIG,这类似于django中的dbs设置。例如:

REDIS_CONFIG = {
    # 'name': arguments passed to redis.Redis to build a connection instance, as dict items
    'default': {'port':63790, 'db':1},
    'foo': {'db':2, unix_socket_path='/tmp/bar'},
    'session': {'db':3},
}

然后

>>> from redisession.helper import get_redis
>>> r = get_redis() # get Redis connection instance of name 'default'
>>> r = get_redis('foo') # or of name 'foo'
>>> r = get_redis('session') # use db 3 for sessions only
>>> r.info()

安全性

建议将存储会话的redis服务器与其他用途隔离。 你可以通过使用一个单独的数据库来实现,比如上面redis配置中的conf'session', 或者在密钥生成器中指定唯一的密钥前缀。 有关可能的安全问题,请参阅https://www.djangoproject.com/weblog/2011/sep/09/security-releases-issued/ 以及https://code.djangoproject.com/changeset/16759

以哈希模式清除过期会话

run django command ^{tt29}$ in shell or cronjob.

测试

^{tt30}$. It uses your REDIS_SESSION_CONFIG settings for tests, so corresponding Redis server should be available.

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

推荐PyPI第三方库


热门话题
java传递实现接口的内部类   java为什么managedbean方法在post请求中的过滤器调用之前调用   java Android应用程序在Android M,O上崩溃,登录A/libc时出错:tid 17938中的致命信号11(SIGSEGV),代码2,故障地址0x343a2944   java JPA存储库。findByAll()返回null,但数据库中存在所有内容   用于发送电子邮件的java Ant脚本   Java小程序HTML页面发生了奇怪的事情   在Postman的请求正文中传递多个JSON数据,并使用Jersy(JXRS)进入Java Rest API   无法强制转换java DAO类   10分钟后重新连接java   正则表达式如何在java中选择字符串直到某个字符   java我的输出有一些问题   Objective中的java时间段   java如何在新屏幕上基于按钮单击在webview中打开url   java哪个selenium版本与Firefox ESR 45.2.0兼容   java无法使用Apache Camel 3.1.0将XML转换为JSON