扩展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这个mysql查询是对还是错?   Java中字符串列表的最大值   二维码Zxing NotFoundException Java   循环Java蛇眼程序错误   JDBCJava。sql。SQLException:[Microsoft][ODBC驱动程序管理器]描述符索引无效   java如何增加if语句中的变量以用于另一个语句?   多线程java。执行多线程数据库应用程序时发生lang.NullPointerException   java为什么HashMap比HashSet快?   java执行与接收到的字符串相对应的方法   java在我的场景中使用ModelMapper的最佳方法   java JSoup从元素列表创建数组列表   字符串Java将文件路径转换为图像   java为什么在windows上尝试启动Grails 3+时出现禁止<403>错误?   java Get实体组计数始终返回0   java正在遍历队列的concurrentHashMap,以查看是否所有队列都是空的,而其他线程可能会添加到队列中   使用ApachePOI批量读取XLSX文件   java如何摆脱arrayList中的匿名对象?   尝试重写NamingProxy内的函数时出现java错误[构造函数的参数0]   java引用Maven jar中JSSE的密钥库文件