¿Alguna vez ha tenido problemas para decidir qué programa de televisión o película ver a continuación? Tomar una decisión sobre su próxima maratón nunca es fácil porque hay muchas opciones accesibles en diferentes proveedores de transmisión.
Al decidir sobre nuestra próxima película, nos basamos principalmente en las reseñas y calificaciones de varias agencias de calificación (como IMDB). Sin embargo, elegir en qué calificación creer puede ser difícil dada la abundancia de estas instituciones.
Dicho esto, con frecuencia es más seguro ver una película que ha recibido buenas calificaciones de varias de estas organizaciones. ¿Pero no es difícil encontrar una película así? ¡Sí, lo es!
¡En esta serie de tres blogs, crearemos una solución de software para resolver este problema exacto! Esta aplicación de Django, a la que llamaremos Flix-Finder, permitiría a su usuario filtrar películas según las calificaciones de varias agencias calificadoras.
Usaremos los servicios de BrightData para obtener los datos necesarios para nuestra aplicación.
Entonces, sin más preámbulos, comencemos a construir Flix-Finder.
¡Antes de comenzar con esta sección, asegúrese de que Django esté instalado en su sistema!
El siguiente comando debería funcionar si Django está instalado en su sistema.
python3 -m django --version
¡Use pip para instalar Django si no está instalado en su sistema!
python3 -m pip install Django
Comencemos configurando nuestro proyecto Django. Crea un nuevo proyecto usando el siguiente comando.
rishabh@my-ubuntu:~/projects$ python3 -m django startproject flix_finder
Cambie el directorio al directorio del proyecto recién creado flix_finder
. Abra su editor de código favorito aquí. Debería ver los siguientes archivos en este directorio creados automáticamente por 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 más sobre estos archivos, consulte esta explicación proporcionada por Django.
¡Intente ejecutar el servidor Django y acceder localhost:8000
para asegurarse de que la configuración se haya completado correctamente!
rishabh@my-ubuntu:~/projects/flix_finder$ python3 manage.py runserver
Una aplicación Django (o aplicación Django) se refiere a un componente de un proyecto Django más grande que encapsula una característica o funcionalidad individual. Las aplicaciones de Django son componentes reutilizables e independientes. Se componen de modelos, vistas, plantillas, pruebas y otros archivos.
Toda la lógica de recomendación para nuestro proyecto residiría en una aplicación llamada recommender
. Para crear esta aplicación, ejecute el siguiente comando.
rishabh@my-ubuntu:~/projects/flix_finder$ python3 manage.py startapp recommender
El comando anterior creará una nueva carpeta llamada recommender
. Toda la lógica de nuestra aplicación iría dentro de esta carpeta.
Queda un paso más antes de que podamos decir que nuestra aplicación se creó con éxito. Continúe y agregue el nombre de la aplicación recién creada en la lista INSTALLED_APPS
presente en 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' ]
Con esto, hemos creado con éxito nuestra aplicación recommender
.
Ahora, vamos a crear nuestra primera vista.
En Django, las vistas son funciones de Python que reciben solicitudes HTTP y devuelven respuestas HTTP. Las vistas juegan un papel importante en la presentación de datos a los usuarios en función de alguna lógica empresarial.
Cree un nuevo método recommender/views.py
. Este método atendería las solicitudes que llegan a través de localhost:8000/
. Por ahora, este punto final simplemente devuelve un mensaje de saludo.
from django.http import HttpResponse def index(request): return HttpResponse("Hello From Recommender!")
Hemos creado el método de vista para manejar la solicitud, pero no hemos especificado (en nuestro proyecto) qué puntos finales corresponden a esta vista. Hacemos esto en los archivos urls.py
Cree un nuevo archivo dentro de la aplicación de recomendación y asígnele el nombre urls.py
. Aquí, especificamos esta correspondencia entre la URL y el método de vista.
from django.urls import path from . import views urlpatterns = [ path("", views.index, name = "index") ]
Ahora necesitamos hacer que Django esté al tanto del archivo de esta nueva URL. Actualice el archivo flix_finder/urls.py
a lo siguiente.
from django.urls import path, include urlpatterns = [ path('', include("recommender.urls")), path('admin/', admin.site.urls), ]
Inicie su servidor, si aún no lo ha hecho, y abra localhost:8000
en su navegador. Deberías ver el mensaje de saludo.
¡Felicitaciones, acaba de completar la creación de su primera vista!
Pongámonos de acuerdo... enviar una cadena como respuesta no es la mejor de las cosas. En su lugar, deberíamos enviar una respuesta HTML adecuada. Y para este propósito exacto, usaremos Plantillas de Django.
Cree templates
de directorio bajo el director recommender
. El nombre de esta carpeta recién creada es especial ya que Django busca por defecto archivos HTML en los directorios denominados templates
.
Cree un nuevo archivo llamado index.html
dentro del directorio recién creado. Dentro de este archivo, escribiremos el HTML que queremos mostrar cuando los usuarios visiten localhost:8000
.
Dado que escribir HTML no es el enfoque principal aquí, me saltaré la explicación de esa parte y simplemente puede copiar el HTML desde aquí .
Estas son algunas de las cosas que necesita saber sobre este archivo HTML (o plantilla de Django):
(1) Este HTML muestra cuatro cosas en la página web: barra de navegación, carrusel, formulario de búsqueda de películas y resultados de búsqueda de películas.
(2) Utiliza el lenguaje de plantillas Django para permitir el uso de variables de Python directamente dentro del HTML.
(3) Espera la variable featured_movies
en el contexto (datos pasados a la plantilla) y la usará para mostrar el carrusel.
(4) Espera que la variable form
se llene con un objeto de formulario de Django y lo usará para mostrar el formulario de búsqueda de películas.
(5) Espera la variable filtered_movie_list
y la utilizará para mostrar los resultados de la búsqueda.
(6) También espera la variable no_result_error
que indica si la búsqueda resultó en una respuesta vacía.
También necesitaremos agregar algo de CSS para diseñar. Cree un directorio static
en el directorio recommender
. Esta carpeta contendrá todos los archivos estáticos.
Cree un nuevo archivo llamado style.css
y pegue el CSS de esta URL .
Con esto, tenemos todo el HTML y CSS requerido en su lugar. A continuación, debemos crear el formulario de búsqueda de películas.
Dado que nuestra plantilla requiere que proporcionemos un objeto de formulario, necesitaremos crear uno.
¿No estás seguro de qué son los formularios de Django? Leer ChatGPT explicar esto -
Los formularios de Django son un módulo en el marco de trabajo de Django que se utiliza para crear y trabajar con formularios HTML. Proporcionan varias ventajas sobre el uso de formularios HTML simples:
Cree un archivo llamado forms.py
dentro del directorio de la aplicación del recomendador. Añádele el siguiente código.
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)
Lo que acabamos de hacer es crear una clase de formulario para nuestro formulario de búsqueda de películas. Este formulario contendrá dos campos como se describe en la clase. Si quieres saber más sobre los formularios, echa un vistazo a esto .
Con todas las cosas requeridas para configurar las plantillas, ahora necesitamos actualizar nuestro método de vista para usar esta plantilla recién creada.
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 su servidor y diríjase a localhost:8000
. Deberías ver la siguiente página.
Con todas las vistas, URL, plantillas y formularios en su lugar, ahora podemos considerar los datos con los que operará nuestra aplicación. Nuestro programa requeriría datos de múltiples agencias calificadoras (IMDB, para empezar).
Desafortunadamente, no existe una API bien definida a través de la cual podamos recuperar estos datos. Un método para obtener esta información es crear nuestros propios scrapers usando Python Selenium. Sin embargo, esto requeriría más trabajo y no todos se sienten cómodos con tales tecnologías.
Una mejor solución es usar servicios de terceros como BrightData. BrightData facilita la obtención de toda esta información.
Para esta primera parte, utilizaremos un conjunto de datos IMDB preseleccionado de BrightData. Este es uno de los muchos conjuntos de datos que están disponibles en BrightData. Así es como podemos conseguirlo.
(1) Regístrese para obtener una cuenta en BrightData.
(2) Vaya a brightdata.com/cp/datasets
desde el navegador o abra el menú Datasets & WebScraper IDE
desde la izquierda.
(3) Vaya a Dataset Marketplace y busque IMDB media dataset
.
(4) Haga clic en Ver conjunto de datos y descargue el conjunto de datos de muestra en formato CSV.
Una vez descargado, cambie el nombre del archivo a IMDB.csv
y colóquelo dentro de la carpeta recommender/static
. Este CSV de muestra contiene 28 atributos de IMDB para más de 1000 películas. Nuestra aplicación funcionará en este conjunto de datos IMDB para esta parte.
Actualicemos el método de visualización para procesar las solicitudes de búsqueda.
Todas las solicitudes de búsqueda del formulario llegan como solicitudes POST. Después de confirmar que el formulario se completó correctamente, enumeraremos todas las películas del archivo CSV descargado y filtraremos aquellas que no coincidan con los criterios de filtro. Así es como se ve el código actualizado.
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)
La implementación de los métodos _getIMDBMovieDataList
y _filter_imdb_movie_list
no es nada específico de Django y es solo Python puro. Por lo tanto, me salto hablar de eso aquí. El archivo views.py
completo se puede encontrar aquí .
Felicitaciones por llegar a este punto. Si ha seguido todos los pasos correctamente, debería poder ejecutar el servidor y realizar búsquedas a través de la interfaz de usuario. Así es como se verían los resultados de la búsqueda.
Todo el código creado como parte de esta serie estará disponible en este repositorio de GitHub. El resultado final de esta parte está contenido en esta rama llamada Part1
.
Siempre es una buena idea verificar su código con el presente en el repositorio para verificar si algo está mal.
Con esto, llegamos al final de la primera parte de esta serie de tres partes. En la siguiente parte, utilizaremos el IDE WebScraper de BrightData para recopilar datos de otras agencias calificadoras. Luego actualizaremos nuestro formulario, lo que permitirá a los usuarios realizar búsquedas más complejas.
¡También haremos que el componente Carrusel sea dinámico!
Hasta la próxima… Hasta entonces, ¡Feliz aprendizaje! 🙂