跳转到主要内容

Django的扩展会话后端

项目描述

Django QSessions

pypi tests ci coverage MIT black

django-qsessions 为 Django 提供了两个扩展会话后端。它们扩展了 Django 的 dbcached_db 后端(以及 Session 模型),增加了以下额外功能

  • 会话有一个外键指向用户
  • 会话存储IP和用户代理

这些功能有助于您实现“会话管理”,并向用户显示活动会话列表。您可以显示每个会话的IP、位置和用户代理,并添加撤销会话的选项。

比较

以下是 Django 会话后端(db、cache、cached_db)与 django-qsessions 之间的简要比较。

django qsessions
cache db cached_db db cached_db
性能 ✔✔
持久性
外键指向用户
存储IP和用户代理

兼容性

  • Python: 3.8, 3.9, 3.10, 3.11, 3.12
  • Django: 4.2, 5.0

安装

如果您的系统处于生产状态,并且正在使用其他会话后端,则需要手动迁移它们。我们没有迁移脚本。

  1. 如果您想使用 cached_db 后端,请确保您已经 配置了缓存。如果您在 CACHES 中定义了多个缓存,Django 将使用默认缓存。要使用另一个缓存,请将 SESSION_CACHE_ALIAS 设置为该缓存的名称。

  2. 从 PyPI 安装最新版本

    pip install django-qsessions
    
  3. 在设置中

    • INSTALLED_APPS 中将 'django.contrib.sessions' 替换为 'qsessions'
    • MIDDLEWAREMIDDLEWARE_CLASSES 中将 'django.contrib.sessions.middleware.SessionMiddleware' 替换为 'qsessions.middleware.SessionMiddleware'
    • SESSION_ENGINE 设置为
      • 'qsessions.backends.cached_db' 如果您想使用 cached_db 后端。
      • 'qsessions.backends.db' 如果您想使用 db 后端。
  4. 运行迁移以创建 qsessions.models.Session 模型。

    python manage.py migrate qsessions
    

要启用使用 GeoIP2 的位置检测(可选)

  1. 安装 geoip2

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

  3. 运行以下命令下载最新的 GeoIP2 数据库。您可以将其添加到 cron 作业以自动更新 GeoIP2 数据库。由于 Maxmind 许可证变更,您将需要获取并使用许可证密钥来下载数据库。您可以在命令行中传递密钥或在 MAXMIND_LICENSE_KEY 环境变量中设置。

    python manage.py download_geoip_db -k mykey
    

用法

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

获取用户的会话

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

删除会话

# Deletes the session from both the database and the cache.
session.delete()

注销用户

user.session_set.all().delete()

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

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

获取 IP 和用户代理

>>> session.ip
'127.0.0.1'
>>> session.user_agent
'Mozilla/5.0 (Linux; Android 10; K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Mobile Safari/537.36'

获取用户设备(解析用户代理字符串)

>>> str(session.device())
'K / Android 10 / Chrome Mobile 118.0.0'
>>> session.device().device
Device(family='K', brand='Generic_Android', model='K')
>>> session.device().os
OperatingSystem(family='Android', version=(10,), version_string='10')
>>> session.device().browser
Browser(family='Chrome Mobile', version=(118, 0, 0), version_string='118.0.0')

如果您已配置 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', ...}

管理页面

image

注意事项

  • session.updated_at 不是会话的确切最后活动时间。每次在数据库中保存会话对象时都会更新它。(例如,当用户登录或当 ip、用户代理或会话数据更改时)

为什么不使用 django-user-sessions

django-user-sessions 有相同的功能,但仅扩展了 db 后端。使用缓存可以提高性能。

我们从 django-user-sessions 中获得了想法和一些代码。感谢 Bouke Haarsma 为编写 django-user-sessions 所做的工作。

开发

  • 创建并激活一个 python 虚拟环境。
  • 使用 pip install -e '.[dev]' 在虚拟环境中安装开发依赖项。
  • 使用 pre-commit install 安装 pre-commit 钩子。
  • 使用覆盖率运行测试
    • py.test --cov

待办事项

  • 编写更好的文档。
    • 解释它是如何工作的(概述)
    • 向现有文档添加更多详细信息。
  • 编写更多测试
  • 性能基准(并与 Django 的 cached_db 进行比较)

欢迎贡献!

许可证

MIT

项目详情


下载文件

下载适用于您的平台的文件。如果您不确定选择哪个,请了解有关 安装包 的更多信息。

源分发

django_qsessions-1.1.5.tar.gz (32.6 kB 查看哈希)

上传于 源代码

构建的版本

django_qsessions-1.1.5-py3-none-any.whl (13.4 kB 查看哈希值)

上传于 Python 3

支持者