开放的编程资料库

当前位置:我爱分享网 > Python教程 > 正文

使用 django-user-visit 在 Django 中跟踪每日用户数据

如果您只想收集有关连接到您的 Web 应用程序的客户端的一些基本信息,那么为您的 Django 项目找出要跟踪的数据、创建数据模型和构建中间件可能会很乏味。幸运的是,库 django-user-visit 是一个方便的 Django 项目,可以为您快速处理所有这些复杂性。在本教程中,我们将学习如何在新的 Django 项目中使用 django-user-visit 为 Django 项目添加每日访问数据跟踪。

完成后,我们可以在Django Admin中查看如下信息:

Django Admin with django-user-visit information

项目要求

确保您已安装 Python 3,因为 Python 2 在 2020 年初达到了生命周期的尽头,不再受支持。最好在您的开发环境中安装 Python 3.7 或更高版本。本教程还将使用:

我们将使用以下依赖项来完成本教程:

  • Django web framework,version 3.0.8
  • django-user-visit,version 0.4

这篇博文中的所有代码都可以在 GitHub 上的 blog-code-examples 存储库的 track-daily-user-data-django-user-visit 目录下的 MIT 许可证下获得开源。根据需要使用源代码你自己的项目。

开发环境搭建

切换到您保存 Python 虚拟环境的目录。使用以下命令为此项目创建一个新的虚拟环境。

通过使用以下命令创建一个新的虚拟环境来启动 Django 项目。我建议使用一个单独的目录,例如 ~/venvs/(波浪号是您用户的 home 目录的快捷方式),以便您始终知道所有 virtualenvs 的位置。

python3 -m venv ~/venvs/djuservisit

使用 activate shell 脚本激活 virtualenv:

source ~/venvs/djuservisit/bin/activate

执行上述命令后,命令提示符会发生变化,virtualenv 的名称会被添加到原始命令提示符格式的前面,因此如果您的提示符只是$,它现在看起来像下面这样:

(djuservisit) $

请记住,您必须在每个要在 virtualenv 中使用依赖项的新终端窗口中激活您的 virtualenv。

我们现在可以将 Djangopackage 安装到已激活但为空的 virtualenv 中。

pip install django==3.0.8 django-user-visit==0.4

查找类似于以下内容的输出以确认已从 PyPI 正确安装了适当的包。

(djuservisit) $ pip install django==3.0.8 django-user-visit==0.4
Collecting django==3.0.8
  Using cached https://files.pythonhosted.org/packages/ca/ab/5e004afa025a6fb640c6e983d4983e6507421ff01be224da79ab7de7a21f/Django-3.0.8-py3-none-any.whl
Collecting django-user-visit==0.4
  Downloading https://files.pythonhosted.org/packages/23/ef/d3ec22c3a897192e267389d6ee59ce1858f5ede262b078f93211aff110e7/django_user_visit-0.4-py3-none-any.whl
Collecting sqlparse>=0.2.2 (from django==3.0.8)
  Using cached https://files.pythonhosted.org/packages/85/ee/6e821932f413a5c4b76be9c5936e313e4fc626b33f16e027866e1d60f588/sqlparse-0.3.1-py2.py3-none-any.whl
Collecting asgiref~=3.2 (from django==3.0.8)
  Using cached https://files.pythonhosted.org/packages/d5/eb/64725b25f991010307fd18a9e0c1f0e6dff2f03622fc4bcbcdb2244f60d6/asgiref-3.2.10-py3-none-any.whl
Collecting pytz (from django==3.0.8)
  Using cached https://files.pythonhosted.org/packages/4f/a4/879454d49688e2fad93e59d7d4efda580b783c745fd2ec2a3adf87b0808d/pytz-2020.1-py2.py3-none-any.whl
Collecting user-agents<3.0,>=2.1 (from django-user-visit==0.4)
  Using cached https://files.pythonhosted.org/packages/1b/be/82e4d20a7716d8e5de98b948edcecff9bb237e6718c3831bd92794fe9821/user-agents-2.1.tar.gz
Collecting ua-parser>=0.9.0 (from user-agents<3.0,>=2.1->django-user-visit==0.4)
  Using cached https://files.pythonhosted.org/packages/9d/22/4d16b08db329fd440eed366d35e4dd7195c9babb4ecac5218f28081522a2/ua_parser-0.10.0-py2.py3-none-any.whl
Installing collected packages: sqlparse, asgiref, pytz, django, ua-parser, user-agents, django-user-visit
  Running setup.py install for user-agents ... done
Successfully installed asgiref-3.2.10 django-3.0.8 django-user-visit-0.4 pytz-2020.1 sqlparse-0.3.1 ua-parser-0.10.0 user-agents-2.1

我们的依赖项已安装,因此我们现在可以创建我们的项目并开始编码。

创建应用

我们拥有开始构建应用程序所需的一切。

我们可以使用 Django django-admin 工具创建样板代码结构来启动我们的项目。切换到您开发应用程序的目录。例如,我通常对所有 myPython 项目使用 /Users/matt/devel/py/。然后运行以下命令启动一个名为djuservisit的Django项目:

django-admin.py startproject djuservisit

请注意,在本教程中,我们对 virtualenv 和 Django 项目目录使用相同的名称,但如果您更喜欢使用不同的名称来组织自己的项目。

django-admin 命令创建一个名为 djuservisit 的目录以及几个子目录,如果您以前使用过 Django,您应该熟悉这些子目录。

将目录更改为新项目。

cd djuservisit

打开###。通过插入两个突出显示的行,将 djuservisit/djuservisit/settings.py 应用及其中间件添加到 user_visits

# djuservisit/djuservisit/settings.py
# Application definition

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'user_visit',
]

MIDDLEWARE = [ 
    'django.middleware.security.SecurityMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.common.CommonMiddleware',
    'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'django.middleware.clickjacking.XFrameOptionsMiddleware',
    'user_visit.middleware.UserVisitMiddleware',
]

在将任何代码部署到生产环境之前,请确保更改 DEBUG 中的默认 SECRET_KEYsettings.py 值。使用 Django 生产部署清单中的信息正确保护您的应用程序,这样您就不会将您的项目添加到网络上的被黑应用程序列表中。

保存并关闭settings.py

创建一个 Django 超级用户,以便您可以访问 Django 管理员。转到此项目的基本目录并使用以下命令使用 manage.py 文件:

python manage.py createsuperuser

按照提示输入您希望本地 Django 超级用户拥有的用户名、电子邮件地址和密码的值。接下来,我们将测试当用户访问由我们的 Django 网络应用程序创建的页面时该库如何工作。

测试 django-user-visit

让我们测试一下我们的基本应用程序。使用以下命令执行开发服务器:

python manage.py runserver

Django 开发服务器应该可以正常启动。

Watching for file changes with StatReloader
Performing system checks...

System check identified no issues (0 silenced).
July 19, 2020 - 13:01:41
Django version 3.0.8, using settings 'djuservisit.settings'
Starting development server at http://127.0.0.1:8000/
Quit the server with CONTROL-C.

打开网络浏览器并转到“http://localhost:8000”。

默认 Django 页面。

这是 Django 在没有任何其他 URL 在根 URL 上提供服务的情况下提供的默认页面,但它适用于我们的目的。

通过将浏览器中的 URL 更改为“http://localhost:8000/admin”,转到 Django 管理。将出现 Django 管理员登录页面。

Django 管理员默认登录屏幕。

使用 manage.py 命令输入您刚刚创建的超级用户的用户名和密码以登录。接下来,您将看到 Django 管理仪表板。

Django 管理仪表板。

“用户访问日志”已经添加到后台。单击“用户访问”链接。

Django 管理仪表板中的 django-user-visit 列表。

将显示当天访问过的所有用户的列表。

django-user-访问 Django 管理中的详细信息页面。

单击任何访问以查看有关记录的更多详细数据,就像使用任何 Django 管理扩展一样。

对于它为您收集的信息,该库的安装非常容易。接下来,让我们仔细看看为该库提供支持的 Django ORM 模型。

检查 django-user-visit 模型

我们确认 django-user-visit 已正确安装。让我们仔细看看库提供的用于存储用户数据的模型。

查看 GitHub 上的源代码 fordjango-user-visit/user_visit/models.py。下面是该源文件相关行的摘录。我突出显示了将在代码摘录下方讨论的几行。

## ... source code abbreviated ...

class UserVisit(models.Model):
    """
    Record of a user visiting the site on a given day.
    This is used for tracking and reporting - knowing the volume of visitors
    to the site, and being able to report on someone's interaction with the site.
    We record minimal info required to identify user sessions, plus changes in
    IP and device. This is useful in identifying suspicious activity (multiple
    logins from different locations).
    Also helpful in identifying support issues (as getting useful browser data
    out of users can be very difficult over live chat).
    """

    user = models.ForeignKey(
        settings.AUTH_USER_MODEL, related_name="user_visits", on_delete=models.CASCADE
    )
    timestamp = models.DateTimeField(
        help_text="The time at which the first visit of the day was recorded",
        default=timezone.now,
    )
    session_key = models.CharField(help_text="Django session identifier", max_length=40)
    remote_addr = models.CharField(
        help_text=(
            "Client IP address (from X-Forwarded-For HTTP header, "
            "or REMOTE_ADDR request property)"
        ),
        max_length=100,
        blank=True,
    )
    ua_string = models.TextField(
        "User agent (raw)", help_text="Client User-Agent HTTP header", blank=True,
    )
    uuid = models.UUIDField(default=uuid.uuid4, editable=False, unique=True)
    hash = models.CharField(
        max_length=32,
        help_text="MD5 hash generated from request properties",
        unique=True,
    )
    created_at = models.DateTimeField(
        help_text="The time at which the database record was created (!=timestamp)",
        auto_now_add=True,
    )

    objects = UserVisitManager()

    class Meta:
        get_latest_by = "timestamp"

    def __str__(self) -> str:
        return f"{self.user} visited the site on {self.timestamp}"

    def __repr__(self) -> str:
        return f"<UserVisit id={self.id} user_id={self.user_id} date='{self.date}'>"

    def save(self, *args: Any, **kwargs: Any) -> None:
        """Set hash property and save object."""
        self.hash = self.md5().hexdigest()
        super().save(*args, **kwargs)

    @property
    def user_agent(self) -> user_agents.parsers.UserAgent:
        """Return UserAgent object from the raw user_agent string."""
        return user_agents.parsers.parse(self.ua_string)

    @property
    def date(self) -> datetime.date:
        """Extract the date of the visit from the timestamp."""
        return self.timestamp.date()

    # see https://github.com/python/typeshed/issues/2928 re. return type
    def md5(self) -> hashlib._Hash:
        """Generate MD5 hash used to identify duplicate visits."""
        h = hashlib.md5(str(self.user.id).encode())  # noqa: S303
        h.update(self.date.isoformat().encode())
        h.update(self.session_key.encode())
        h.update(self.remote_addr.encode())
        h.update(self.ua_string.encode())
        return h

根据上面突出显示的几点需要注意:

  • UserVisit 模型使用 user = models.ForeignKey... 行匹配 Django 用户模型
  • 代码使用 ### 函数以确保自动填充某些字段,例如使用 save 模块的 hash 属性
  • 此库依赖于 user_agents 库来解析客户端正在使用的浏览器的用户代理

阅读像 django-user-visit 这样的库的源代码不仅有助于了解它在幕后做了什么,而且有助于学习编写您自己的应用程序的新方法。

查看 Django 代码示例和 Django 扩展页面,查看更多具有良好 Python 示例代码的项目,您可以从中学习。

其他资源

我们刚刚构建了一个使用 django-user-visit 库跟踪每日用户访问的应用程序。

接下来,尝试一些其他相关的 Django 教程:

  • 通过 CDN 在 Django 模板中快速使用 Bootstrap 4
  • 如何使用 Mapbox 将地图添加到 Django Web 应用程序项目
  • 使用 Rollbar 监控 Django 项目

有问题吗?通过在 Twitter@fullstackpython 或@mattmakai 上的 Full Stack Python 存储库上的 GitHub 问题单让我知道。如果您在本教程中发现问题或错误,请在 GitHub 上创建源存储库并提交包含修复的拉取请求。

未经允许不得转载:我爱分享网 » 使用 django-user-visit 在 Django 中跟踪每日用户数据

感觉很棒!可以赞赏支持我哟~

赞(0) 打赏