如果您只想收集有关连接到您的 Web 应用程序的客户端的一些基本信息,那么为您的 Django 项目找出要跟踪的数据、创建数据模型和构建中间件可能会很乏味。幸运的是,库 django-user-visit 是一个方便的 Django 项目,可以为您快速处理所有这些复杂性。在本教程中,我们将学习如何在新的 Django 项目中使用 django-user-visit 为 Django 项目添加每日访问数据跟踪。
完成后,我们可以在Django Admin中查看如下信息:
项目要求
确保您已安装 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_KEY
和 settings.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 在没有任何其他 URL 在根 URL 上提供服务的情况下提供的默认页面,但它适用于我们的目的。
通过将浏览器中的 URL 更改为“http://localhost:8000/admin”,转到 Django 管理。将出现 Django 管理员登录页面。
使用 manage.py
命令输入您刚刚创建的超级用户的用户名和密码以登录。接下来,您将看到 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 上创建源存储库并提交包含修复的拉取请求。