Aula 86 – O Poder da Análise de Dados em Aplicativos Web
Aula 86 – O Poder da Análise de Dados em Aplicativos Web
Voltar para página principal do blog
Todas as aulas desse curso
Aula 85 Aula 87
Redes Sociais:
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
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:
- 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 campoGenericForeignKey
do Django, que permite criar uma chave estrangeira genérica para qualquer modelo.from django.contrib.contenttypes.models import ContentType
: Importa o modeloContentType
do Django, que é usado para armazenar informações sobre os tipos de modelos no projeto.
- Definição de
User
:User = settings.AUTH_USER_MODEL
: Define uma variávelUser
que armazena o modelo de usuário definido nas configurações do projeto.
- 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 modeloContentType
. 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 estrangeirascontent_type
eobject_id
.timestamp = models.DateTimeField(auto_now_add=True)
: Armazena a data e hora em que o objeto foi visualizado.
- Método
__str__
:- Retorna uma representação em string do objeto
ObjectViewed
, mostrando o objeto visualizado e o horário.
- Retorna uma representação em string do objeto
- 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:
- Definição do campo: Ao usar o
GenericForeignKey
, você precisa definir dois campos:content_type
eobject_id
. O campocontent_type
armazena uma referência ao tipo de modelo (classe) que você deseja associar, enquanto o campoobject_id
armazena o ID do objeto específico desse tipo de modelo. - Exemplo de Uso: Suponha que você tenha um modelo
Comment
que pode ser associado a vários outros modelos, comoPost
,Photo
,Video
, etc. Em vez de criar uma chave estrangeira separada para cada tipo de modelo, você pode usarGenericForeignKey
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.