扩展django的缓存数据库会话后端

django-qsessions的Python项目详细描述


https://user-images.githubusercontent.com/2115303/35397912-f00efbb4-0205-11e8-89b5-3d4f585a4588.pnghttps://img.shields.io/pypi/v/django-qsessions.svghttps://img.shields.io/travis/QueraTeam/django-qsessions.svghttps://img.shields.io/github/license/QueraTeam/django-qsessions.svg

django qsessions是django的会话后端,它扩展了django的cached_db会话后端 以及Session模型以添加以下功能:

  • 会话对用户具有外键
  • 会话存储IP和用户代理

比较

这里是django的会话后端(db、cache、cached-db)、django-user-sessions和django-qsessions之间的简要比较。

dbcachecached_dbdjango-user-sessionsdjango-qsessions
Better Performance✔✔
Persistent
Foreign Key to User
Store IP and User Agent

兼容性

Python versionDjango versions
3.72.0, 2.1, 2.2
3.61.10, 1.11, 2.0, 2.1, 2.2
3.51.10, 1.11, 2.0, 2.1, 2.2
3.41.10, 1.11, 2.0
2.71.10, 1.11

安装

请注意,如果您的系统正在生产,并且有很多活动会话 使用另一个会话后端,您需要手动迁移它们。我们没有迁移脚本。

  1. 首先,确保你已经configured your cache。如果在中定义了多个缓存 CACHES,django将使用默认缓存。要使用另一个缓存,请设置SESSION_CACHE_ALIAS 以缓存的名称命名。

  2. 从pypi安装最新版本:

    pip install django-qsessions
    
  3. 在“设置”中:

    • INSTALLED_APPS中,用'qsessions'替换'django.contrib.sessions'
    • MIDDLEWAREMIDDLEWARE_CLASSES替换中 'django.contrib.sessions.middleware.SessionMiddleware''qsessions.middleware.SessionMiddleware'
    • SESSION_ENGINE设置为'qsessions.backends.cached_db'
  4. 运行迁移以创建qsessions.models.Session模型。

    python manage.py migrate qsessions
    

使用geoip2启用位置检测(可选):

  1. 安装geoip2包:

    pip install geoip2
    
  2. GEOIP_PATH设置为存储geoip2数据库的目录。

  3. 运行以下命令下载最新的geoip2数据库。可以将此命令添加到cron 自动更新geoip2 db的作业。

    python manage.py download_geoip_db
    

用法

django qsessions有一个具有以下字段的自定义Session模型: useruser_agentcreated_atupdated_atip

获取用户会话:

user.session_set.filter(expire_date__gt=timezone.now())

删除会话:

# Deletes session from both DB and cachesession.delete()

注销用户:

user.session_set.all().delete()

会话创建时间(用户登录时间):

>>>session.created_atdatetime.datetime(2018,6,12,17,9,17,443909,tzinfo=<UTC>)

IP和用户代理:

>>>session.ip'127.0.0.1'>>>session.user_agent'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.181 Safari/537.36'

如果您已经配置了geoip2,那么可以调用.location().location_info()

>>>session.location()'Tehran, Iran'>>>session.location_info(){'city':'Tehran','continent_code':'AS','continent_name':'Asia','country_code':'IR','country_name':'Iran','time_zone':'Asia/Tehran',...}

管理页:

https://user-images.githubusercontent.com/2115303/41525284-b0b258b0-72f5-11e8-87f1-8770e0094f4c.png

注意事项

  • session.updated_at不是会话的最后一个活动。每次会议都会更新 数据库中的对象已保存。(例如,当用户登录时,或当IP、用户代理或会话数据更改时)

为什么不django-user-sessions

django-user-sessions具有相同的功能, 但它是基于db后端的。使用缓存将提高性能。

我们从django用户会话中得到了一些想法和代码。 非常感谢Bouke Haarsma编写django用户会话。

开发

  • 使用pip install -e'.[dev]'
  • 使用py.test --cov .
  • 运行覆盖率测试

待办事项

  • 编写更好的文档。
    • 解释它的工作原理(总结)
    • 将更多的细节添加到现有文档中。
  • 编写更多测试
  • 性能基准(并与django的cached_db进行比较)

欢迎投稿!

许可证

麻省理工学院

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

推荐PyPI第三方库


热门话题
单击搜索按钮后,不会填充java JList   JavaSpring请求映射antmatcher忽略URL   国际化为什么java语言环境是最终的?   java文本区域的swing错误   docker FnProject java函数,其依赖项托管在私有存储库中   使用Java/Scala标记为HTML   多线程中的Java调用子类方法   java在查找字符串中第一个非重复字符时计算字符值   java在spring安全性中autoconfig=true有什么用途   如何为Kotlin扩展函数的接收者添加KDoc注释(Java中的第一个参数,`this`在Kotlin中)   java注释节点JaxB编组   java我一直得到这个异常错误空指针异常我如何停止这个错误并得到一个工作错误   Java中的python乘法字符串   用java将英语翻译成本地语言   java如何构建自己的传输级协议?   Java全局变量之类的