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. Configurando o aplicativo 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 . Abra seu editor de código favorito aqui. Você deve ver os seguintes arquivos neste diretório criado automaticamente pelo Django. flix_finder 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 fornecida pelo Django. explicação Tente executar o servidor Django e acessar para garantir que a configuração foi concluída corretamente! localhost:8000 rishabh@my-ubuntu:~/projects/flix_finder$ python3 manage.py runserver Criando um novo aplicativo e nossa primeira visualização 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 . Para criar este aplicativo, execute o seguinte comando. recommender rishabh@my-ubuntu:~/projects/flix_finder$ python3 manage.py startapp recommender O comando acima criará uma nova pasta chamada . Toda a lógica do nosso aplicativo estaria dentro dessa pasta. recommender 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 presente em . INSTALLED_APPS 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 . Esse método atenderia às solicitações provenientes de . Por enquanto, esse ponto de extremidade simplesmente retorna uma mensagem de saudação. recommender/views.py localhost:8000/ 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 . Aqui, especificamos essa correspondência entre a URL e o método view. urls.py 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 para o seguinte. flix_finder/urls.py 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 em seu navegador. Você deve ver a mensagem de saudação. localhost:8000 Parabéns, você acabou de criar sua primeira visualização! Vamos usar modelos… 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 sob o diretor . O nome desta pasta recém-criada é especial, pois o padrão do Django procura por arquivos HTML nos diretórios denominados . templates recommender templates Crie um novo arquivo chamado dentro do diretório recém-criado. Dentro desse arquivo, escreveremos o HTML que queremos renderizar quando os usuários visitarem . index.html 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) - 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. (1) Ele usa a linguagem de template Django para permitir o uso de variáveis Python diretamente dentro do HTML. (2) Ele espera a variável no contexto (dados passados para o modelo) e a usará para exibir o carrossel. (3) featured_movies Ele espera que a variável seja preenchida com um objeto Formulário Django e o usará para exibir o Formulário de pesquisa de filme. (4) form Ele espera a variável e a usará para exibir os resultados da pesquisa. (5) filtered_movie_list Também espera a variável que indica se a busca resultou em uma resposta vazia. (6) no_result_error Também precisaremos adicionar algum CSS para estilizar. Crie um diretório sob o diretório . Esta pasta conterá todos os arquivos estáticos. static recommender Crie um novo arquivo chamado e cole o CSS . style.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. Criando 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: Renderização automática de HTML. Você define uma classe de formulário Django e o Django a renderiza como um formulário HTML. Validação de dados. Os formulários Django validam os dados enviados e os limpam antes de salvar. Vinculando dados a formulários. Você pode vincular dados existentes a um formulário para exibição ao usuário para edição. Crie um arquivo chamado dentro do diretório app do recomendador. Adicione o seguinte código a ele. forms.py 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 Atualizando a visualização do índice 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 . Você deve ver a página a seguir. localhost:8000 Dados do IMDB da BrightData 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. Inscreva-se para uma conta no BrightData. (1) Vá para no navegador ou abra o menu à esquerda. (2) brightdata.com/cp/datasets Datasets & WebScraper IDE Acesse o Dataset Marketplace e procure por . (3) IMDB media dataset Clique em Exibir conjunto de dados e baixe o conjunto de dados de amostra no formato CSV. (4) Depois de baixado, renomeie o arquivo para e coloque-o dentro da pasta . 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. IMDB.csv recommender/static Atualizando a exibição de índice para receber um envio de formulário 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 e não é nada específico do Django e é puro Python. Assim, pulo de falar sobre isso aqui. Todo o arquivo pode ser encontrado . _getIMDBMovieDataList _filter_imdb_movie_list views.py aqui Produto final 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. Código para esta série Todo o código criado como parte desta série estará disponível repositório GitHub. O resultado final desta parte está contido ramificação chamada . neste nesta Part1 É sempre uma boa ideia cruzar seu código com o presente no repositório para verificar se algo está errado. Observações Finais 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! 🙂