Aula 86 – O Poder da Análise de Dados em Aplicativos Web

Aula 86 – O Poder da Análise de Dados em Aplicativos Web

Loja Online - Django

Loja Online – Django

Pacote Programador Fullstack

Pacote Programador Fullstack

Voltar para página principal do blog

Todas as aulas desse curso

Aula 85                                   Aula 87

Redes Sociais:

facebook

Meus links de afiliados:

Hostinger

Digital Ocean

One.com

Melhore seu NETWORKING

https://digitalinnovation.one/

Participe de comunidades de desenvolvedores:

Fiquem a vontade para me adicionar ao linkedin.

E também para me seguir no https://github.com/toticavalcanti.

Código final da aula:

https://github.com/toticavalcanti

Quer aprender python3 de graça e com certificado? Acesse então:

https://workover.com.br/python-codigo-fluente

Canais do Youtube

Toti

Lofi Music Zone Beats

Backing Track / Play-Along

Código Fluente

Putz!

Vocal Techniques and Exercises

PIX para doações

PIX Nubank

PIX Nubank


 

Aula 86 – O Poder da Análise de Dados em Aplicativos Web

Compreendendo o Uso dos Usuários em Aplicativos Web

Quando se trata de criar aplicativos web, é essencial compreender como os usuários interagem com seu aplicativo para aprimorá-lo e oferecer uma experiência melhor.

Criando Sua Própria Abordagem Analítica

Uma maneira de alcançar isso é desenvolver sua própria aplicação para lidar com análises de dados.

Usando Ferramentas de Terceiros: O Papel do Google Analytics

No entanto, há momentos em que a adoção de ferramentas analíticas de terceiros, como o Google Analytics, pode ser considerada. É importante ressaltar que não há problema algum em fazê-lo.

O Controle Fundamental: Dados Sob Seu Comando

No entanto, um aspecto crítico frequentemente ausente ao usar essas ferramentas é o controle total sobre seus próprios dados, principalmente a questão da privacidade.

Priorizando o Controle do Projeto Próprio

Nossa abordagem é buscar o controle dentro do nosso próprio projeto. Portanto, almejamos criar análises personalizadas usando Django. Isso nos permite monitorar o comportamento do usuário e obter informações vitais para aprimorar nossos serviços.

A Melhoria Contínua do Serviço

A principal meta é aprimorar constantemente os serviços oferecidos.

Começar com análises básicas é um passo crucial nessa jornada.

Empoderando Seu Serviço

Ao final do dia, nosso objetivo é elevar a qualidade de nosso serviço de maneira contínua.

O Valor da Análise Interna

Em nosso contexto, a busca é por controle total sobre nossas análises.

Assim, utilizamos análises personalizadas com Django.

Embora ferramentas como o Google Analytics possam ser úteis, o custo do controle total pode superar o benefício da conveniência.

Aplicando o Conhecimento na Prática

Para começar, vamos criar um novo app, isto é, um novo componente do projeto do ecommerce.

Dentro da pasta django_ecommerce/e_commerce, a pasta onde tem o manage.py, execute o comando:
python manage.py startapp analytics

No models.py do analytics, coloque o código abaixo.

django_ecommerce/e_commerce/analytics/models.py


from django.conf import settings
from django.db import models
from django.contrib.contenttypes.fields import GenericForeignKey
from django.contrib.contenttypes.models import ContentType

User = settings.AUTH_USER_MODEL

class ObjectViewed(models.Model):
    user = models.ForeignKey(User, blank=True, null=True, on_delete=models.CASCADE) # specific user, instance.id
    ip_address = models.CharField(max_length=220, blank=True, null=True)
    content_type = models.ForeignKey(ContentType, on_delete=models.CASCADE) # Product, Order, Cart, Address...
    object_id = models.PositiveIntegerField() # User id, Product id, Order id
    content_object = GenericForeignKey('content_type', 'object_id')
    timestamp = models.DateTimeField(auto_now_add=True)

    def __str__(self):
        return f"{self.content_object} viewed on {self.timestamp}"

    class Meta:
        ordering = ['-timestamp'] # most recent saved show up first
        verbose_name = 'Object viewed'
        verbose_name_plural = 'Objects viewed'

Explicando o código acima

O código define um modelo chamado ObjectViewed que é usado para rastrear quando um objeto (qualquer instância de modelo) é visualizado por um usuário em um site Django.

Aqui está uma explicação passo a passo do código:

  1. Importações:
    • from django.conf import settings: Importa as configurações do projeto Django.
    • from django.db import models: Importa o módulo de modelos do Django.
    • from django.contrib.contenttypes.fields import GenericForeignKey: Importa o campo GenericForeignKey do Django, que permite criar uma chave estrangeira genérica para qualquer modelo.
    • from django.contrib.contenttypes.models import ContentType: Importa o modelo ContentType do Django, que é usado para armazenar informações sobre os tipos de modelos no projeto.
  2. Definição de User:
    • User = settings.AUTH_USER_MODEL: Define uma variável User que armazena o modelo de usuário definido nas configurações do projeto.
  3. Definição do modelo ObjectViewed:
    • user = models.ForeignKey(User, blank=True, null=True, on_delete=models.CASCADE): Cria uma chave estrangeira para o modelo de usuário. Permite rastrear qual usuário visualizou o objeto. Pode ser nulo ou vazio.
    • ip_address = models.CharField(max_length=220, blank=True, null=True): Armazena o endereço IP do usuário que visualizou o objeto.
    • content_type = models.ForeignKey(ContentType, on_delete=models.CASCADE): Cria uma chave estrangeira para o modelo ContentType. Armazena o tipo de modelo do objeto que foi visualizado.
    • object_id = models.PositiveIntegerField(): Armazena o ID do objeto que foi visualizado.
    • content_object = GenericForeignKey('content_type', 'object_id'): Cria uma chave genérica que se relaciona com o objeto real que foi visualizado, usando as chaves estrangeiras content_type e object_id.
    • timestamp = models.DateTimeField(auto_now_add=True): Armazena a data e hora em que o objeto foi visualizado.
  4. Método __str__:
    • Retorna uma representação em string do objeto ObjectViewed, mostrando o objeto visualizado e o horário.
  5. Classe Meta:
    • ordering = ['-timestamp']: Define a ordenação dos objetos visualizados pelo horário, do mais recente ao mais antigo.
    • verbose_name = 'Object viewed': Define o nome legível do modelo no singular.
    • verbose_name_plural = 'Objects viewed': Define o nome legível do modelo no plural.

GenericForeignKey 

O GenericForeignKey é um campo fornecido pelo Django que permite criar uma relação genérica entre dois modelos.

Ele é usado para criar uma chave estrangeira para qualquer modelo, independentemente do tipo de modelo ao qual está se referindo.

Isso é particularmente útil quando você deseja criar associações polimórficas, ou seja, quando uma entidade pode estar associada a várias classes de modelos diferentes.

Aqui está como o GenericForeignKey funciona:

  1. Definição do campo: Ao usar o GenericForeignKey, você precisa definir dois campos: content_type e object_id. O campo content_type armazena uma referência ao tipo de modelo (classe) que você deseja associar, enquanto o campo object_id armazena o ID do objeto específico desse tipo de modelo.
  2. Exemplo de Uso: Suponha que você tenha um modelo Comment que pode ser associado a vários outros modelos, como Post, Photo, Video, etc. Em vez de criar uma chave estrangeira separada para cada tipo de modelo, você pode usar GenericForeignKey para criar uma associação genérica.

from django.contrib.contenttypes.fields import GenericForeignKey
from django.contrib.contenttypes.models import ContentType
from django.db import models

class Comment(models.Model):
    content_type = models.ForeignKey(ContentType, on_delete=models.CASCADE)
    object_id = models.PositiveIntegerField()
    content_object = GenericForeignKey('content_type', 'object_id')
    text = models.TextField()

Usando a Associação: Agora você pode associar um objeto Comment a qualquer modelo registrado no sistema. Por exemplo, para associar um comentário a um objeto Post, você faria o seguinte:

Exemplo de um post associado


post = Post.objects.get(id=1)
comment = Comment(content_object=post, text="Ótimo post!")
comment.save()

Exemplo de uma foto associada


# Suponha que você tenha uma foto existente
photo = Photo.objects.get(id=1)

# Crie um comentário associado a essa foto
comment = Comment(content_type=ContentType.objects.get_for_model(photo), object_id=photo.id, text="Ótima foto!")

# Salve o comentário
comment.save() 

Exemplo de um vídeo associado


# Suponha que você tenha um vídeo existente
video = Video.objects.get(id=1)

# Crie um comentário associado a esse vídeo
comment = Comment(content_type=ContentType.objects.get_for_model(video), object_id=video.id, text="Ótimo vídeo!")

# Salve o comentário
comment.save() 

Recuperando Dados: Quando você recupera um objeto Comment, pode acessar o objeto associado por meio do campo content_object. O Django cuida dos detalhes de recuperar o objeto correto com base no content_type e object_id.


comment = Comment.objects.get(id=1) 
associated_object = comment.content_object # Retorna o objeto Post associado

Vantagens:

    • Reduz a necessidade de criar várias chaves estrangeiras para diferentes tipos de modelos.
    • Possibilita associações polimórficas e flexíveis entre modelos.
    • Permite que um único campo GenericForeignKey seja usado para associar a diferentes tipos de objetos.

Cuidados:

  • Pode ser um pouco mais complexo em termos de consultas e manipulação de dados em comparação com chaves estrangeiras tradicionais.
  • O desempenho pode ser impactado em consultas complexas envolvendo GenericForeignKey.

Em resumo, o GenericForeignKey é uma ferramenta poderosa para criar relações polimórficas entre modelos no Django, permitindo maior flexibilidade e reutilização de código.

Registrando o app Analytics no settings do projeto

django_ecommerce/e_commerce/e_commerce/settings.py 

"""
Django settings for e_commerce project.

Generated by 'django-admin startproject' using Django 2.1.4.

For more information on this file, see
https://docs.djangoproject.com/en/2.1/topics/settings/

For the full list of settings and their values, see
https://docs.djangoproject.com/en/2.1/ref/settings/
"""

import os

# Build paths inside the project like this: os.path.join(BASE_DIR, ...)
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))


# Quick-start development settings - unsuitable for production
# See https://docs.djangoproject.com/en/2.1/howto/deployment/checklist/

# SECURITY WARNING: keep the secret key used in production secret!
SECRET_KEY = 'xjmv-0^l__duq4-xp54m94bsf02lx4&1xka_ykd_(7(5#9^1o^'

# SECURITY WARNING: don't run with debug turned on in production!
DEBUG = True

ALLOWED_HOSTS = []


# Application definition

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

    #our apps
    'addresses',
    'analytics',
    'billing',
    'accounts',
    'carts',
    'orders',
    'products',
    'search',
    'tags',
]

DEFAULT_AUTO_FIELD = "django.db.models.BigAutoField"

AUTH_USER_MODEL = 'accounts.User' # changes the built-in user model to ours

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

LOGOUT_REDIRECT_URL = '/login/'
ROOT_URLCONF = 'e_commerce.urls'

TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [os.path.join(BASE_DIR, 'templates')],
        'APP_DIRS': True,
        'OPTIONS': {
            'context_processors': [
                'django.template.context_processors.debug',
                'django.template.context_processors.request',
                'django.contrib.auth.context_processors.auth',
                'django.contrib.messages.context_processors.messages',
            ],
        },
    },
]

WSGI_APPLICATION = 'e_commerce.wsgi.application'


# Database
# https://docs.djangoproject.com/en/2.1/ref/settings/#databases

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.sqlite3',
        'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
    }
}


# Password validation
# https://docs.djangoproject.com/en/2.1/ref/settings/#auth-password-validators

AUTH_PASSWORD_VALIDATORS = [
    {
        'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator',
    },
    {
        'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator',
    },
    {
        'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator',
    },
    {
        'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator',
    },
]


# Internationalization
# https://docs.djangoproject.com/en/2.1/topics/i18n/

LANGUAGE_CODE = 'en-us'

TIME_ZONE = 'UTC'

USE_I18N = True

USE_L10N = True

USE_TZ = True


# Static files (CSS, JavaScript, Images)
# https://docs.djangoproject.com/en/2.1/howto/static-files/

STATIC_URL = '/static/'

STATICFILES_DIRS = [
     os.path.join(BASE_DIR, "static_local")
]

STATIC_ROOT = os.path.join(os.path.dirname(BASE_DIR), "static_cdn", "static_root")

MEDIA_URL = '/media/'
MEDIA_ROOT = os.path.join(os.path.dirname(BASE_DIR), "static_cdn", "media_root")

Agora as Migrações

python manage.py makemigrations
python manage.py migrate

Registre o ObjectViewed no admin

django_ecommerce/e_commerce/analytics/admin.py


from django.contrib import admin
from .models import ObjectViewed
admin.site.register(ObjectViewed)

Nesta aula, você aprendeu sobre a importância da análise de dados em aplicativos web e como criar análises personalizadas usando Django.

Também foi apresentado o uso do GenericForeignKey para criar associações flexíveis entre modelos.

No final, você viu como registrar o app Analytics e o modelo ObjectViewed no projeto Django para rastrear o comportamento do usuário e melhorar seus serviços.

É isso, até a próxima. \o/

Voltar para página principal do blog

Todas as aulas desse curso

Aula 85                                   Aula 87

Código final da aula:

https://github.com/toticavalcanti

Canais do Youtube

Toti

Backing Track / Play-Along

Código Fluente

Putz!

Vocal Techniques and Exercises

Dêem um joinha 👍 na página do Código Fluente no
Facebook.

Sigam o Código Fluente no Instagram e no TikTok.

Código Fluente no Pinterest.

Meus links de afiliados:

Hostinger

Digital Ocean

One.com

Nos vemos na próxima então, \o/  😉 Bons Estudos!

About The Author
-

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>