Рубрики
Без рубрики

Отслеживание ежедневных пользовательских данных в Django с помощью django-user-visit

Узнайте, как легко отслеживать ежедневные посещения пользователей и связанные данные в проектах Django с помощью django-user-visit.

Автор оригинала: Matt Makai.

Может быть утомительно выяснять, какие данные отслеживать, создавать модели данных. и создайте промежуточное ПО для своего проекта Django, если вы просто хотите собрать базовую информацию о клиентах, которые подключаются к вашему веб-приложению . К счастью, библиотека django-user-visit это удобный проект Django, который быстро обрабатывает все этой сложности для вас. В этом уроке мы узнаем как использовать django-user-visit в новом проекте Django чтобы добавить отслеживание данных о ежедневных посещениях в проекты Django.

Когда мы закончим, мы сможем просмотреть следующую информацию в Django Admin:

Администратор Django с информацией о посещении пользователя django

Требования к проекту

Убедитесь, что у вас установлен Python 3, потому что Python 2 достиг своего истек срок службы в начале 2020 года и больше не поддерживается. Желательно, чтобы у вас было установлен Python 3.7 или выше в вашей среде разработки. В этом руководстве также будут использоваться:

Мы будем использовать следующие зависимости, чтобы завершить это руководство:

Весь код в этом сообщении в блоге доступен с открытым исходным кодом по лицензии MIT. на GitHub в разделе каталог track-daily-user-data-django-user-visit репозитория blog-code-examples . Используйте исходный код по своему усмотрению для своих собственных проектов.

Настроена среда разработки

Перейдите в каталог, в котором вы храните свой Python виртуальные среды. Создайте новый virtualenv для этого проекта, используя следующие команда.

Запустите проект Django, создав новый виртуальная среда используя следующую команду. Рекомендую использовать отдельный каталог например ~/venvs/ (тильда – это ярлык для домашней страницы вашего пользователя каталог), чтобы вы всегда знали, где находятся все ваши виртуальные файлы располагается.

python3 -m venv ~/venvs/djuservisit

Активируйте virtualenv с помощью сценария оболочки activate :

source ~/venvs/djuservisit/bin/activate

После выполнения указанной выше команды в командной строке появится измените так, чтобы имя virtualenv добавлялось к исходный формат командной строки, поэтому, если ваша подсказка просто $ , теперь он будет выглядеть следующим образом:

(djuservisit) $

Помните, что вы должны активировать виртуальный сервер в каждом новом терминале. окно, в котором вы хотите использовать зависимости в файле virtualenv.

Теперь мы можем установить Django пакет в активированный, но в остальном пустой файл 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 для создания шаблонная структура кода для начала нашего проекта. Перейдите в каталог, в котором вы разрабатываете свои приложения. За Например, я обычно использую /Users/matt/devel/py/ для всех моих Проекты Python. Затем выполните следующую команду, чтобы запустить Django проект с названием djuservisit :

django-admin.py startproject djuservisit

Обратите внимание, что в этом руководстве мы используем одно и то же имя для обоих virtualenv и каталог проекта Django, но они могут быть разные имена, если вы предпочитаете это для организации ваших собственных проектов.

Команда django-admin создает каталог с именем djuservisit . вместе с несколькими подкаталогами, с которыми вы должны быть знакомы если вы ранее работали с Django.

Поменяйте каталоги в новый проект.

cd djuservisit

Откройте djuservisit/djuservisit/settings.py . Добавьте user_visits app и его связующее ПО в settings.py , вставив два выделенные строки:

# 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 Admin. Перейдите в базовый каталог этого проекта и используйте файл 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, но он работает для наших целей.

Перейдите к администратору Django, изменив URL-адрес в браузере на «http://localhost: 8000/admin». Откроется страница входа в систему администратора Django.

Экран входа администратора Django по умолчанию.

Введите имя пользователя и пароль суперпользователя, которого вы только что создали с помощью команду manage.py для входа в систему. Затем вы увидите администратора Django приборная доска.

Панель администратора Django.

«Журнал посещений пользователей» уже добавлен в админку. Нажмите на ссылку «Посещения пользователем».

django-user-visit list на панели администратора Django.

Появится список всех пользователей, которые посетили за день.

django-user-visit страница сведений в админке Django.

Щелкните любое из посещений, чтобы просмотреть более подробные данные о записи, точно так же, как и с любым расширением администратора Django.

Эту библиотеку было довольно легко установить, учитывая, что она агрегаты для вас. Далее давайте подробнее рассмотрим Модель Django ORM, которая поддерживает эту библиотеку.

Проверка модели django-user-visit

Мы подтвердили, что django-user-visit установлен правильно. Давай ближе посмотрите на модель, которую предоставляет библиотека для хранения пользовательских данных.

Взгляните на исходный код для django-user-visit/user_visit/models.py на GitHub. Ниже приведен отрывок с соответствующими строками этого исходного файла. Я выделил несколько строк, которые будут рассмотрены ниже отрывка кода.

## ... 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""

    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 соответствует модели
  • Модель пользователя Django
  • с помощью строки user = models.ForeignKey ...
  • В коде используется функция save , чтобы гарантировать, что некоторые поля
  • заполняются автоматически, например свойство hash с помощью
  • модуль hashlib
  • Эта библиотека зависит от
  • библиотека user_agents для анализа
  • User-Agent
  • браузера, который использует клиент

Чтение исходного кода для библиотек, таких как django-user-visit, полезно не только знать, что он делает под прикрытием, но и узнавать новые способы кодирования ваших собственных приложений.

Взгляните на примеры кода Django и Страницы расширений Django чтобы увидеть больше проектов с хорошим примером кода Python, на котором вы можете учиться.

Дополнительные ресурсы

Мы только что закончили создавать приложение, которое отслеживает ежедневные посещения пользователей с помощью библиотека django-user-visit.

Затем попробуйте некоторые из этих других связанных руководств по Django:

  • Быстрое использование Bootstrap 4 в шаблоне Django с CDN
  • Как добавить карты в проекты веб-приложений Django с помощью Mapbox
  • Мониторинг проектов Django с помощью Rollbar

Вопросов? Дай мне знать через запрос на выпуск GitHub в репозитории Full Stack Python , в Твиттере @fullstackpython или @mattmakai . Если вы видите проблему или ошибку в этом руководстве, пожалуйста, форк исходного репозитория на GitHub и отправьте запрос на перенос с исправлением.