Header Ads Widget

Ticker

6/recent/ticker-posts

Seguimiento de datos de usuario diarios en Django con django-user-visit

 Puede ser tedioso averiguar qué datos rastrear, crear modelos de datos y construir middleware para su proyecto de Django si solo desea recopilar información básica sobre los clientes que se conectan a su aplicación web. Afortunadamente, la biblioteca django-user-visit es un proyecto de Django útil que maneja rápidamente toda esta complejidad por usted. En este tutorial, aprenderemos cómo usar django-user-visit en un nuevo proyecto de Django para agregar el seguimiento de datos de visitas diarias a los proyectos de Django.

Cuando hayamos terminado, podemos ver información como la siguiente en el administrador de Django:

Administrador de Django con información de visita de usuario de django

Requerimientos del proyecto

Asegúrese de tener Python 3 instalado, porque Python 2 llegó al final de su vida útil a principios de 2020 y ya no es compatible. Preferiblemente, debería tener Python 3.7 o superior instalado en su entorno de desarrollo . Este tutorial también utilizará:

Usaremos las siguientes dependencias para completar este tutorial:

Todo el código de esta publicación de blog está disponible en código abierto bajo la licencia MIT en GitHub en el directorio track-daily-user-data-django-user-visit del repositorio de ejemplos de código de blog . Utilice el código fuente como desee para sus propios proyectos.

Configuración del entorno de desarrollo

Cambie al directorio donde guarda sus entornos virtuales de Python Cree un nuevo virtualenv para este proyecto usando el siguiente comando.

Inicie el proyecto Django creando un nuevo entorno virtual usando el siguiente comando. Recomiendo usar un directorio separado como ~/venvs/(la tilde es un atajo para el home directorio de su usuario ) para que siempre sepa dónde se encuentran todos sus virtualenvs.

python3 -m venv ~ / venvs / djuservisit

Active virtualenv con el activatescript de shell:

fuente ~ / venvs / djuservisit / bin / enable

Después de que se ejecute el comando anterior, el símbolo del sistema cambiará de modo que el nombre del virtualenv se anteponga al formato original del símbolo del sistema, por lo que si su mensaje es simple $, ahora se verá así:

(djuservisit) $

Recuerde, debe activar su virtualenv en cada nueva ventana de terminal donde quiera usar dependencias en virtualenv.

Ahora podemos instalar el paquete Django en el virtualenv activado pero vacío.

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

Busque un resultado similar al siguiente para confirmar que los paquetes adecuados se instalaron correctamente desde PyPI.

(djuservisit) $ pip install django == 3.0.8 django-user-visit == 0.4
Recopilando django == 3.0.8
  Usando https://files.pythonhosted.org/packages/ca/ab/5e004afa025a6fb640c6e983d4983e6507421ff01be224da79ab7de7a21f/Django-3.0.8-py3-none-any.whl almacenado en caché
Recopilación de django-user-visit == 0.4
  Descargando https://files.pythonhosted.org/packages/23/ef/d3ec22c3a897192e267389d6ee59ce1858f5ede262b078f93211aff110e7/django_user_visit-0.4-py3-none-any.whl
Recopilando sqlparse> = 0.2.2 (de django == 3.0.8)
  Usando https://files.pythonhosted.org/packages/85/ee/6e821932f413a5c4b76be9c5936e313e4fc626b33f16e027866e1d60f588/sqlparse-0.3.1-py2.py3-none-any.whl almacenado en caché
Recopilando asgiref ~ = 3.2 (de django == 3.0.8)
  Usando https://files.pythonhosted.org/packages/d5/eb/64725b25f991010307fd18a9e0c1f0e6dff2f03622fc4bcbcdb2244f60d6/asgiref-3.2.10-py3-none-any.whl almacenado en caché
Recolectando pytz (de django == 3.0.8)
  Usando https://files.pythonhosted.org/packages/4f/a4/879454d49688e2fad93e59d7d4efda580b783c745fd2ec2a3adf87b0808d/pytz-2020.1-py2.py3-none-any.whl almacenado en caché
Recopilación de agentes de usuario <3.0,> = 2.1 (de django-user-visit == 0.4)
  Usando https://files.pythonhosted.org/packages/1b/be/82e4d20a7716d8e5de98b948edcecff9bb237e6718c3831bd92794fe9821/user-agents-2.1.tar.gz en caché
Recopilando ua-parser> = 0.9.0 (de agentes de usuario <3.0,> = 2.1-> django-user-visit == 0.4)
  Usando https://files.pythonhosted.org/packages/9d/22/4d16b08db329fd440eed366d35e4dd7195c9babb4ecac5218f28081522a2/ua_parser-0.10.0-py2.py3-none-any.whl almacenado en caché
Instalación de paquetes recopilados: sqlparse, asgiref, pytz, django, ua-parser, user-agents, django-user-visit
  Ejecutando setup.py install para agentes de usuario ... hecho
Se instaló correctamente 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

Nuestras dependencias están instaladas, por lo que ahora podemos crear nuestro proyecto y comenzar a codificar.

Creando la aplicación

Tenemos todo lo que necesitamos para comenzar a construir nuestra aplicación.

Podemos usar la herramienta Django django-admin para crear la estructura de código estándar para comenzar nuestro proyecto. Cambie al directorio donde desarrolla sus aplicaciones. Por ejemplo, normalmente lo uso /Users/matt/devel/py/para todos mis proyectos de Python. Luego ejecute el siguiente comando para iniciar un proyecto de Django llamado djuservisit:

django-admin.py startproject djuservisit

Tenga en cuenta que en este tutorial estamos usando el mismo nombre para el directorio de proyectos virtualenv y Django, pero pueden tener nombres diferentes si lo prefiere para organizar sus propios proyectos.

El django-admincomando crea un directorio nombrado djuservisit junto con varios subdirectorios con los que debería estar familiarizado si ha trabajado anteriormente con Django.

Cambie de directorio al nuevo proyecto.

cd djuservisit

Abierta djuservisit/djuservisit/settings.pyAgregue la user_visits aplicación y su middleware settings.pyinsertando las dos líneas resaltadas:

# djuservisit / djuservisit / settings.py
# Definición de la aplicación

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',
]

Asegúrese de cambiar los valores predeterminados DEBUGantes de implementar cualquier código en producción. Asegure su aplicación correctamente con la información de la lista de verificación de implementación de producción de Django para que no agregue su proyecto a la lista de aplicaciones pirateadas en la web.SECRET_KEYsettings.py

Guardar y cerrar settings.py.

Cree un superusuario de Django para que pueda acceder al administrador de Django. Vaya al directorio base de este proyecto y use el manage.pyarchivo con el siguiente comando:

python manage.py crea superusuario

Siga las indicaciones e ingrese valores para el nombre de usuario, la dirección de correo electrónico y la contraseña que desea que tenga su superusuario local de Django. A continuación, probaremos cómo funciona esta biblioteca cuando un usuario visita una página creada por nuestra aplicación web Django.

Probando django-user-visit

Probemos nuestra aplicación básica. Ejecute el servidor de desarrollo con el siguiente comando:

python manage.py runserver

El servidor de desarrollo de Django debería iniciarse sin problemas.

Observación de cambios de archivos con StatReloader
Realización de comprobaciones del sistema ...

La verificación del sistema no identificó problemas (0 silenciados).
19 de julio de 2020-13: 01:41
Django versión 3.0.8, usando la configuración 'djuservisit.settings'
Iniciando el servidor de desarrollo en http://127.0.0.1:8000/
Salga del servidor con CONTROL-C.

Abra un navegador web y vaya a "http: // localhost: 8000".

Página predeterminada de Django.

Esa es la página predeterminada proporcionada por Django en ausencia de otras URL para servir en la URL raíz, pero funciona para nuestros propósitos.

Vaya al administrador de Django cambiando la URL en su navegador a "http: // localhost: 8000 / admin". Aparecerá la página de inicio de sesión de Django Admin.

Pantalla de inicio de sesión predeterminada del administrador de Django.

Introduzca el nombre de usuario y la contraseña del superusuario que acaba de crear con el manage.pycomando para iniciar sesión. A continuación, verá el panel de administración de Django.

Panel de administración de Django.

El "Registro de visitas del usuario" ya se ha agregado al administrador. Haga clic en el enlace "Visitas de usuario".

django-user-visit list en el panel de administración de Django.

Aparecerá la lista de todos los usuarios que han visitado por día.

página de detalles de django-user-visit en el administrador de Django.

Haga clic en cualquiera de las visitas para ver datos más detallados sobre el registro, tal como lo haría con cualquier extensión de administrador de Django.

Esa biblioteca fue bastante fácil de instalar por la información que agrega para usted. A continuación, echemos un vistazo más de cerca al modelo ORM de Django que impulsa esta biblioteca.

Inspeccionando el modelo django-user-visit

Confirmamos que django-user-visit está instalado correctamente. Echemos un vistazo más de cerca al modelo que proporciona la biblioteca para almacenar los datos del usuario.

Eche un vistazo al código fuente de django-user-visit / user_visit / models.py en GitHub. A continuación se muestra un extracto con las líneas relevantes de ese archivo fuente. He resaltado algunas líneas que se discutirán debajo del extracto del código.

## ... código fuente abreviado ...

clase UserVisit (modelos.Modelo):
    "" "
    Registro de un usuario que visita el sitio en un día determinado.
    Esto se usa para rastrear e informar, conociendo el volumen de visitantes
    al sitio y poder informar sobre la interacción de alguien con el sitio.
    Registramos la información mínima necesaria para identificar las sesiones de los usuarios, además de los cambios en
    IP y dispositivo. Esto es útil para identificar actividades sospechosas (múltiples
    inicios de sesión desde diferentes ubicaciones).
    También es útil para identificar problemas de soporte (como obtener datos útiles del navegador
    de usuarios puede ser muy difícil en el chat en vivo).
    "" "

    user = models.ForeignKey ( 
        settings.AUTH_USER_MODEL, related_name = "user_visits", on_delete = models.CASCADE 
    )
    marca de tiempo = modelos.DateTimeField (
        help_text = "La hora a la que se registró la primera visita del día",
        predeterminado = timezone.now,
    )
    session_key = models.CharField (help_text = "Identificador de sesión de Django", max_length = 40)
    remote_addr = modelos.CharField (
        help_text = (
            "Dirección IP del cliente (del encabezado HTTP X-Forjected-For,"
            "o propiedad de solicitud REMOTE_ADDR)"
        ),
        longitud_máxima = 100,
        en blanco = Verdadero,
    )
    ua_string = modelos.TextField ( 
        "Agente de usuario (sin formato)", help_text = "Encabezado HTTP del agente de usuario del cliente", en blanco = Verdadero, 
    )
    uuid = modelos.UUIDField (predeterminado = uuid.uuid4, editable = falso, único = verdadero)
    hash = modelos.CharField (
        longitud_máxima = 32,
        help_text = "Hash MD5 generado a partir de las propiedades de la solicitud",
        único = Verdadero,
    )
    created_at = modelos.DateTimeField (
        help_text = "La hora a la que se creó el registro de la base de datos (! = marca de tiempo)",
        auto_now_add = Verdadero,
    )

    objetos = UserVisitManager ()

    clase Meta:
        get_latest_by = "marca de tiempo"

    def __str __ (self) -> str:
        return f "{self.user} visitó el sitio el {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) -> Ninguno:
        "" "Establecer propiedad hash y guardar objeto." ""
        self.hash = self.md5 (). hexdigest ()
        super (). guardar (* argumentos, ** kwargs)

    @propiedad
    def user_agent (self) -> user_agents.parsers.UserAgent:
        "" "Devuelve el objeto UserAgent de la cadena de user_agent sin procesar." ""
        return user_agents.parsers.parse (self.ua_string)

    @propiedad
    def date (self) -> datetime.date:
        "" "Extraiga la fecha de la visita de la marca de tiempo." ""
        return self.timestamp.date ()

    # ver https://github.com/python/typeshed/issues/2928 re. tipo de retorno
    def md5 (yo) -> hashlib._Hash:
        "" "Generar hash MD5 que se utiliza para identificar visitas duplicadas." ""
        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 ())
        volver h

Algunas cosas a tener en cuenta según lo resaltado anteriormente:

  • El UserVisitmodelo coincide con el modelo de usuario de Django usando la user = models.ForeignKey...línea
  • El código usa la savefunción para garantizar que algunos de los campos se completen automáticamente, como la hashpropiedad que usa el hashlibmódulo
  • Esta biblioteca depende de la biblioteca user_agents para analizar el User-Agent del navegador que está usando el cliente

Leer el código fuente de bibliotecas como django-user-visit es útil no solo para saber qué está haciendo bajo las sábanas, sino también para aprender nuevas formas de codificar sus propias aplicaciones.

Eche un vistazo a los ejemplos de código de Django y las páginas de extensiones de Django para ver más proyectos con un buen código de ejemplo de Python del que puede aprender.

Publicar un comentario

0 Comentarios