Você já lutou para decidir qual programa de TV ou filme assistir a seguir? Tomar uma decisão sobre o seu próximo binge-watch nunca é fácil porque há tantas opções acessíveis em diferentes provedores de streaming.
Ao decidir sobre nosso próximo filme, contamos principalmente com as críticas e classificações de várias agências de classificação (como o IMDB). No entanto, escolher em qual classificação acreditar pode ser difícil, dada a abundância dessas instituições.
Dito isso, geralmente é mais seguro assistir a um filme que recebeu boas notas de várias dessas organizações. Mas não é difícil encontrar um filme assim? É sim!
Nesta série de três blogs, criaremos uma solução de software para resolver exatamente esse problema! Esse aplicativo Django, que chamaremos de Flix-Finder, permitiria ao usuário filtrar filmes com base nas classificações de várias agências de classificação.
Usaremos os serviços da BrightData para coletar os dados necessários para nosso aplicativo.
Então, sem mais delongas, vamos começar a construir o Flix-Finder.
Antes de começar com esta seção, certifique-se de que o Django esteja instalado em seu sistema!
O seguinte comando deve funcionar se o Django estiver instalado em seu sistema.
python3 -m django --version
Use o pip para instalar o Django se ele não estiver instalado em seu sistema!
python3 -m pip install Django
Vamos começar configurando nosso projeto Django. Crie um novo projeto usando o seguinte comando.
rishabh@my-ubuntu:~/projects$ python3 -m django startproject flix_finder
Altere o diretório para o diretório do projeto recém-criado flix_finder
. Abra seu editor de código favorito aqui. Você deve ver os seguintes arquivos neste diretório criado automaticamente pelo Django.
rishabh@my-ubuntu:~/projects/flix_finder$ tree . . ├── flix_finder │ ├── asgi.py │ ├── __init__.py │ ├── settings.py │ ├── urls.py │ └── wsgi.py └── manage.py 1 directory, 6 files
Para saber mais sobre esses arquivos, consulte esta explicação fornecida pelo Django.
Tente executar o servidor Django e acessar localhost:8000
para garantir que a configuração foi concluída corretamente!
rishabh@my-ubuntu:~/projects/flix_finder$ python3 manage.py runserver
Um aplicativo Django (ou aplicativo Django) refere-se a um componente de um projeto Django maior que encapsula um recurso ou funcionalidade individual. Os aplicativos Django são componentes reutilizáveis e independentes. Eles consistem em modelos, visualizações, modelos, testes e outros arquivos.
Toda a lógica do recomendador para nosso projeto residiria em um aplicativo chamado recommender
. Para criar este aplicativo, execute o seguinte comando.
rishabh@my-ubuntu:~/projects/flix_finder$ python3 manage.py startapp recommender
O comando acima criará uma nova pasta chamada recommender
. Toda a lógica do nosso aplicativo estaria dentro dessa pasta.
Há mais uma etapa restante antes de podermos dizer que nosso aplicativo foi criado com sucesso. Vá em frente e adicione o nome do aplicativo recém-criado na lista INSTALLED_APPS
presente em flix_finder/settings.py
.
# flix_finder/settings.py INSTALLED_APPS = [ 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', 'recommender' ]
Com isso, criamos com sucesso nosso aplicativo recommender
.
Agora, vamos criar nossa primeira view.
No Django, views são funções Python que recebem requisições HTTP e retornam respostas HTTP. As exibições desempenham um papel importante na apresentação de dados aos usuários com base em alguma lógica de negócios.
Crie um novo método em recommender/views.py
. Esse método atenderia às solicitações provenientes de localhost:8000/
. Por enquanto, esse ponto de extremidade simplesmente retorna uma mensagem de saudação.
from django.http import HttpResponse def index(request): return HttpResponse("Hello From Recommender!")
Criamos o método view para lidar com a solicitação, mas não especificamos (em nosso projeto) quais endpoints correspondem a essa view. Fazemos isso nos arquivos urls.py
Crie um novo arquivo dentro do aplicativo recomendador e nomeie-o como urls.py
. Aqui, especificamos essa correspondência entre a URL e o método view.
from django.urls import path from . import views urlpatterns = [ path("", views.index, name = "index") ]
Agora precisamos deixar o Django ciente desse novo arquivo de URL. Atualize o arquivo flix_finder/urls.py
para o seguinte.
from django.urls import path, include urlpatterns = [ path('', include("recommender.urls")), path('admin/', admin.site.urls), ]
Inicie seu servidor, se ainda não estiver, e abra localhost:8000
em seu navegador. Você deve ver a mensagem de saudação.
Parabéns, você acabou de criar sua primeira visualização!
Convenhamos… enviar uma string como resposta não é a coisa mais legal. Em vez disso, devemos enviar uma resposta HTML adequada. E para este exato propósito, estaremos usando Django Templates.
Crie um diretório templates
sob o diretor recommender
. O nome desta pasta recém-criada é especial, pois o padrão do Django procura por arquivos HTML nos diretórios denominados templates
.
Crie um novo arquivo chamado index.html
dentro do diretório recém-criado. Dentro desse arquivo, escreveremos o HTML que queremos renderizar quando os usuários visitarem localhost:8000
.
Como escrever HTML não é o foco principal aqui, vou pular a explicação dessa parte e você pode simplesmente copiar o HTML daqui .
Aqui estão algumas das coisas que você precisa saber sobre este arquivo HTML (ou modelo Django) -
(1) Este HTML exibe quatro itens na página da Web - barra de navegação, carrossel, formulário de pesquisa de filmes e resultados de pesquisa de filmes.
(2) Ele usa a linguagem de template Django para permitir o uso de variáveis Python diretamente dentro do HTML.
(3) Ele espera a variável featured_movies
no contexto (dados passados para o modelo) e a usará para exibir o carrossel.
(4) Ele espera que a variável form
seja preenchida com um objeto Formulário Django e o usará para exibir o Formulário de pesquisa de filme.
(5) Ele espera a variável filtered_movie_list
e a usará para exibir os resultados da pesquisa.
(6) Também espera a variável no_result_error
que indica se a busca resultou em uma resposta vazia.
Também precisaremos adicionar algum CSS para estilizar. Crie um diretório static
sob o diretório recommender
. Esta pasta conterá todos os arquivos estáticos.
Crie um novo arquivo chamado style.css
e cole o CSS deste URL .
Com isso, temos todo o HTML e CSS necessários no lugar. Em seguida, precisamos criar o formulário de pesquisa de filmes.
Como nosso modelo exige que forneçamos um objeto de formulário, precisaremos criar um.
Não tem certeza do que são Formulários Django? Leia ChatGPT explicar isso -
Os formulários Django são um módulo no framework Django usado para criar e trabalhar com formulários HTML. Eles fornecem várias vantagens sobre o uso de formulários HTML simples:
Crie um arquivo chamado forms.py
dentro do diretório app do recomendador. Adicione o seguinte código a ele.
from django import forms class MovieSearchForm(forms.Form): imdb_rating = forms.DecimalField(min_value=0.1, max_value=9.9, required=True, label='Minimum IMDB Rating') release_year = forms.IntegerField(required=True)
O que acabamos de fazer foi criar uma classe de formulário para nosso Formulário de Pesquisa de Filmes. Este formulário conterá dois campos conforme descrito na aula. Se você quiser saber mais sobre formulários, confira isso .
Com todas as coisas necessárias para os modelos definidos, agora precisamos atualizar nosso método de exibição para usar este modelo recém-criado.
from .forms import MovieSearchForm # We use a hard-code list here, we will make it dynamic in subsequent parts featured_movie_list = [ { "img_src": "https://images.thedirect.com/media/article_full/amazing-spider-man-3-andrew-garfield-movie-mcu.jpg", "img_alt": "...", "active": True }, { "img_src": "https://static1.colliderimages.com/wordpress/wp-content/uploads/2022/11/avatar-the-way-of-water-poster.jpg", "img_alt": "...", "active": False } ] def index(request): context = { "featured_movies": featured_movie_list, "form": MovieSearchForm() } return render(request, 'index.html', context)
Inicie seu servidor e vá para localhost:8000
. Você deve ver a página a seguir.
Com todas as exibições, URLs, modelos e formulários prontos, agora podemos considerar os dados nos quais nosso aplicativo irá operar. Nosso programa exigiria dados de várias agências de classificação (IMDB, para começar).
Infelizmente, não existe uma API bem definida por meio da qual possamos recuperar esses dados. Um método para obter essas informações é criar nossos próprios raspadores usando Python Selenium. No entanto, isso exigiria mais trabalho e nem todos se sentem confortáveis com essas tecnologias.
Uma solução melhor é usar serviços de terceiros como o BrightData. O BrightData facilita a obtenção de todas essas informações.
Para esta primeira parte, usaremos um conjunto de dados IMDB pré-curado da BrightData. Este é um dos muitos conjuntos de dados disponíveis no BrightData. É assim que podemos obtê-lo.
(1) Inscreva-se para uma conta no BrightData.
(2) Vá para brightdata.com/cp/datasets
no navegador ou abra o menu Datasets & WebScraper IDE
à esquerda.
(3) Acesse o Dataset Marketplace e procure por IMDB media dataset
.
(4) Clique em Exibir conjunto de dados e baixe o conjunto de dados de amostra no formato CSV.
Depois de baixado, renomeie o arquivo para IMDB.csv
e coloque-o dentro da pasta recommender/static
. Este CSV de amostra contém 28 atributos IMDB para mais de 1.000 filmes. Nosso aplicativo funcionará neste conjunto de dados IMDB para esta parte.
Vamos atualizar o método view para processar solicitações de pesquisa.
Todas as solicitações de pesquisa do formulário chegam como solicitações POST. Depois de confirmar que o formulário está devidamente preenchido, listaremos todos os filmes do arquivo CSV baixado e filtraremos aqueles que não corresponderem aos critérios do filtro. Aqui está a aparência do código atualizado.
def index(request): if request.method == 'POST': form = MovieSearchForm(request.POST) if form.is_valid(): movie_list = _getIMDBMovieDataList() filtered_movie_list = _filter_imdb_movie_list(movie_list, form) context = { "featured_movies": featured_movie_list, "form": MovieSearchForm(), "filtered_movie_list": filtered_movie_list, "no_result_error": len(filtered_movie_list)==0 } return render(request, 'index.html', context) context = { "featured_movies": featured_movie_list, "form": MovieSearchForm() } return render(request, 'index.html', context)
A implementação dos métodos _getIMDBMovieDataList
e _filter_imdb_movie_list
não é nada específico do Django e é puro Python. Assim, pulo de falar sobre isso aqui. Todo o arquivo views.py
pode ser encontrado aqui .
Parabéns por chegar a este ponto. Se você seguiu todas as etapas corretamente, poderá executar o servidor e realizar pesquisas por meio da interface do usuário. Veja como ficariam os resultados da pesquisa.
Todo o código criado como parte desta série estará disponível neste repositório GitHub. O resultado final desta parte está contido nesta ramificação chamada Part1
.
É sempre uma boa ideia cruzar seu código com o presente no repositório para verificar se algo está errado.
Com isso, chegamos ao final da primeira parte desta série de três partes. Na próxima parte, usaremos o IDE WebScraper da BrightData para coletar dados de outras agências de classificação. Em seguida, atualizaremos nosso formulário, permitindo assim que os usuários realizem pesquisas mais complexas.
Também tornaremos dinâmico o componente Carrossel!
Até a próxima… Até lá, Bom aprendizado! 🙂