Django用户访问日志记录插件[django_user_visit 2.0]汉化

news/2025/2/19 10:20:12

Django用户访问日志记录插件:
django_user_visit汉化包
为了给用户显示中文,制作的汉化包,与原来版本区别仅仅是字符串
1:用户不同设备登录时,将会记录
2:用户与之前的ip不相同时,将会记录
3:用户注销,再次登录时,将会记录
4:每隔一天,就算设备与ip相同,但是为当天的首次访问网站,也将记录
原版本为:django-user-visit 2.0
2024年3月11日最新版本

在这里插入图片描述

pipy官网
[django-user-visit · PyPI](https://pypi.org/project/django-user-visit/)
gihub网址
[GitHub - yunojuno/django-user-visit: Django app for recording daily user visits](https://github.com/yunojuno/django-user-visit)

pipy
django-user-visit · PyPI
github
GitHub - yunojuno/django-user-visit: Django app for recording daily user visits

支持

>=python3.8版本
django3.2
django4.0
django4.1
django4.2
django5.0

安装过程

pip install django-user-visit

版本

django-user-visit          2.0

添加

INSTALLED_APPS = [  
# 添加用户访问记录  
'user_visit',
# 写在这个列表最后面就行
]

MIDDLEWARE = [  
    'django.middleware.clickjacking.XFrameOptionsMiddleware',  
    'user_visit.middleware.UserVisitMiddleware',  # 这一行
]

执行迁移

python manage.py migrate
(venv) PS C:\Docker\Python\weidanyewu> python manage.py migrate
Operations to perform:
  Apply all migrations: admin, api1, auth, captcha, contenttypes, outsourcing, ownorder, sessions, store, user_visit, userprofile
Running migrations:
  Applying user_visit.0001_initial... OK
  Applying user_visit.0002_add_created_at... OK
  Applying user_visit.0003_uservisit_context... OK
  Applying user_visit.0004_uservisit_browser_uservisit_device_uservisit_os... OK

下面进行汉化

在这里插入图片描述

在这里插入图片描述

3:修改【user_visit】包中的models.py文件内容为:

python">from __future__ import annotations

import datetime
import hashlib
import uuid
from typing import Any

import user_agents
from django.conf import settings
from django.db import models
from django.http import HttpRequest
from django.utils import timezone
from django.utils.translation import gettext_lazy as _lazy

from user_visit.settings import REQUEST_CONTEXT_ENCODER, REQUEST_CONTEXT_EXTRACTOR


def parse_remote_addr(request: HttpRequest) -> str:
    """Extract client IP from request."""
    x_forwarded_for = request.headers.get("X-Forwarded-For", "")
    if x_forwarded_for:
        return x_forwarded_for.split(",")[0]
    return request.META.get("REMOTE_ADDR", "")


def parse_ua_string(request: HttpRequest) -> str:
    """Extract client user-agent from request."""
    return request.headers.get("User-Agent", "")


class UserVisitManager(models.Manager):
    """Custom model manager for UserVisit objects."""

    def build(self, request: HttpRequest, timestamp: datetime.datetime) -> UserVisit:
        """Build a new UserVisit object from a request, without saving it."""
        uv = UserVisit(
            user=request.user,
            timestamp=timestamp,
            session_key=request.session.session_key,
            remote_addr=parse_remote_addr(request),
            ua_string=parse_ua_string(request),
            context=REQUEST_CONTEXT_EXTRACTOR(request),
        )
        uv.hash = uv.md5().hexdigest()
        uv.browser = uv.user_agent.get_browser()[:200]
        uv.device = uv.user_agent.get_device()[:200]
        uv.os = uv.user_agent.get_os()[:200]
        return uv


class UserVisit(models.Model):
    """
用户在给定日期访问网站的记录。

这用于跟踪和报告 - 了解网站的访问者数量,并能够报告某人与网站的互动。

我们记录识别用户会话所需的最少信息,以及 IP 和设备的变化。这在识别可疑活动(来自不同位置的多次登录)时很有用。

还有助于识别支持问题(因为在实时聊天中从用户那里获取有用的浏览器数据可能非常困难)。

    """

    user = models.ForeignKey(
        settings.AUTH_USER_MODEL, related_name="user_visits", on_delete=models.CASCADE,
        verbose_name="用户"
    )
    timestamp = models.DateTimeField(
        _lazy("访问时间"),
        help_text="记录当天第一次访问的时间",
        default=timezone.now,
    )
    session_key = models.CharField(help_text="Django 会话标识符", max_length=40,)
    remote_addr = models.CharField(_lazy("登录地址"),
        help_text="客户端 IP 地址(来自 X-Forwarded-For HTTP 标头或REMOTE_ADDR请求属性)",
        max_length=100,
        blank=True,
    )
    ua_string = models.TextField(
        _lazy("用户代理(原始)"),
        help_text=_lazy("Client User-Agent HTTP header"),
        blank=True,
    )
    browser = models.CharField(
        _lazy("浏览器"),
        max_length=200,
        blank=True,
        default="",
    )
    device = models.CharField(
        _lazy("设备类型"),
        max_length=200,
        blank=True,
        default="",
    )
    os = models.CharField(
        _lazy("操作系统"),
        max_length=200,
        blank=True,
        default="",
    )
    uuid = models.UUIDField(default=uuid.uuid4, editable=False, unique=True)
    hash = models.CharField(  # noqa: A003
        max_length=32,
        help_text=_lazy("从请求属性生成的 MD5 哈希值"),
        unique=True,
    )
    created_at = models.DateTimeField(
        _lazy("创建时间"),
        help_text= "创建数据库记录的时间 (!=timestamp)",
        auto_now_add=True,
    )
    context = models.JSONField(
        default=dict,
        blank=True,
        null=True,
        encoder=REQUEST_CONTEXT_ENCODER,
        help_text=_lazy("用于存储临时/临时数据 - 例如GeoIP."),
    )

    objects = UserVisitManager()

    class Meta:
        get_latest_by = "timestamp"
        verbose_name = '用户访问日志'
        verbose_name_plural='用户访问日志'

    def __str__(self) -> str:
        return f"{self.user} 访问了该网站 {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:
        """设置哈希属性并保存对象。"""
        self.hash = self.md5().hexdigest()
        super().save(*args, **kwargs)

    @property
    def user_agent(self) -> user_agents.parsers.UserAgent:
        """从原始user_agent字符串中返回 UserAgent 对象。"""
        return user_agents.parsers.parse(self.ua_string)

    @property
    def date(self) -> datetime.date:
        """从时间戳中提取访问日期。"""
        return self.timestamp.date()

    # see https://github.com/python/typeshed/issues/2928 re. return type
    def md5(self) -> hashlib._Hash:
        """生成用于识别重复访问的 MD5 哈希值。"""
        h = hashlib.md5(str(self.user.id).encode())  # noqa: S303, S324
        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

4:修改【user_visit】包中的app.py文件内容为:

python">from django.apps import AppConfig  
  
  
class UserVisitAppConfig(AppConfig):  
    name = "user_visit"  
    verbose_name = "用户访问日志"  
    default_auto_field = "django.db.models.AutoField"
文章来源:https://blog.csdn.net/weixin_47021806/article/details/136639740
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.niftyadmin.cn/n/5422452.html

相关文章

Springboot+vue的政府管理的系统设计(有报告)。Javaee项目,springboot vue前后端分离项目。

演示视频&#xff1a; Springbootvue的政府管理的系统设计&#xff08;有报告&#xff09;。Javaee项目&#xff0c;springboot vue前后端分离项目。 项目介绍&#xff1a; 采用M&#xff08;model&#xff09;V&#xff08;view&#xff09;C&#xff08;controller&#xff…

深入理解 CSS——CSS进阶与实践(5w字高频面试题整理)

本文总结了CSS高频面试题&#xff0c;并搭配了演示动画进行CSS样式演示。介绍了关于如何理解盒模型&#xff0c;如何实现块级元素水平居中&#xff0c;如何实现两侧固定中间自适应的三栏布局、如何实现两栏布局&#xff0c;如何进行响应式设计&#xff0c;对BFC的理解&#xff…

基于极限学习机的定位仿真,基于极限学习机的wifi定位,基于极限学习机的室内定位

目录 背影 极限学习机 基于极限学习机的定位仿真,基于极限学习机的wifi定位,基于极限学习机的室内定位 主要参数 MATLAB代码 效果图 结果分析 展望 完整代码下载链接:基于极限学习机的定位仿真,基于极限学习机的wifi定位,基于极限学习机的室内定位(代码完整,数据齐全)…

付强:基于注意力机制的听觉前端处理 | 嘉宾公布

一、智能家居与会议系统专题论坛 智能家居与会议系统专题论坛将于3月28日同期举办&#xff01; 智能会议系统它通过先进的技术手段&#xff0c;提高了会议效率&#xff0c;降低了沟通成本&#xff0c;提升了参会者的会议体验。对于现代企业、政府机构和学术界是不可或缺的。在这…

如何在项目中应用“API签名认证”

❤ 作者主页&#xff1a;李奕赫揍小邰的博客 ❀ 个人介绍&#xff1a;大家好&#xff0c;我是李奕赫&#xff01;(&#xffe3;▽&#xffe3;)~* &#x1f34a; 记得点赞、收藏、评论⭐️⭐️⭐️ &#x1f4e3; 认真学习!!!&#x1f389;&#x1f389; 文章目录 为什么需要AP…

ctfshow-XXE(web373-web378)

目录 XXE&#xff08;外部实体注入攻击&#xff09; web373 web374 web375 web376 web377 web378 知识点 XXE&#xff08;外部实体注入攻击&#xff09; XXE这几关有个前提flag在根目录下文件名为flag web373 <?php error_reporting(0); libxml_disable_entity_…

C++/CLI学习笔记1(快速打通c++与c#相互调用的桥梁)

1.1 什么是c/cli C/CLI是C和.NET Framework平台版本&#xff0c;从Microsoft Visual Studio 2005开始便己存在&#xff0c;已成为一项国际标准。ECMA标准请参考以下网址:http://www.ecma-international.org/publications/standards/Ecma-372.htm 它对标准C进行了一些修改。标…

元分析_学习笔记

目录 1.元分析的基本作用 2.元分析的步骤 2.1文献检索 2.2数据编录 2.3数据分析 3.元分析的基本模型 4.元分析拓展趋势 5.元分析注意事项 6.总结 1.元分析的基本作用 传统作用&#xff1a;针对某一具体的相关关系&#xff0c;对来自不同样本的研究结果进行整合&#xf…