Haben Sie schon einmal darüber nachgedacht, welche Fernsehsendung oder welchen Film Sie als nächstes ansehen möchten? Die Entscheidung für Ihren nächsten Binge-Watch zu treffen, ist nie einfach, da bei verschiedenen Streaming-Anbietern so viele Optionen verfügbar sind.
Bei der Entscheidung für unseren nächsten Film verlassen wir uns in erster Linie auf Rezensionen und Bewertungen verschiedener Ratingagenturen (wie IMDB). Angesichts der Fülle dieser Institutionen könnte es jedoch schwierig sein, sich für ein Rating zu entscheiden, an das man glauben soll.
Allerdings ist es oft sicherer, einen Film anzusehen, der von mehreren dieser Organisationen gute Noten erhalten hat. Aber ist es nicht schwierig, einen solchen Film zu finden? Ja ist es!
In dieser dreiteiligen Blogserie werden wir eine Softwarelösung entwickeln, um genau dieses Problem zu lösen! Diese Django-Anwendung, die wir Flix-Finder nennen werden, würde es ihrem Benutzer ermöglichen, Filme basierend auf Bewertungen mehrerer Ratingagenturen zu filtern.
Wir werden die Dienste von BrightData nutzen, um die erforderlichen Daten für unsere Anwendung abzurufen.
Beginnen wir also ohne weitere Umschweife mit der Entwicklung von Flix-Finder.
Bevor Sie mit diesem Abschnitt beginnen, stellen Sie sicher, dass Django auf Ihrem System installiert ist!
Der folgende Befehl sollte funktionieren, wenn Django auf Ihrem System installiert ist.
python3 -m django --version
Verwenden Sie pip, um Django zu installieren, wenn es nicht auf Ihrem System installiert ist!
python3 -m pip install Django
Beginnen wir mit der Einrichtung unseres Django-Projekts. Erstellen Sie mit dem folgenden Befehl ein neues Projekt.
rishabh@my-ubuntu:~/projects$ python3 -m django startproject flix_finder
Wechseln Sie das Verzeichnis in das neu erstellte Projektverzeichnis flix_finder
. Öffnen Sie hier Ihren bevorzugten Code-Editor. In diesem Verzeichnis sollten Sie die folgenden Dateien sehen, die automatisch von Django erstellt wurden.
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
Weitere Informationen zu diesen Dateien finden Sie in dieser Erklärung von Django.
Versuchen Sie, den Django-Server auszuführen und auf localhost:8000
zuzugreifen, um sicherzustellen, dass die Einrichtung ordnungsgemäß abgeschlossen wurde!
rishabh@my-ubuntu:~/projects/flix_finder$ python3 manage.py runserver
Eine Django-App (oder Django-Anwendung) bezieht sich auf eine Komponente eines größeren Django-Projekts, die ein einzelnes Feature oder eine einzelne Funktionalität kapselt. Django-Apps sind wiederverwendbare und unabhängige Komponenten. Sie bestehen aus Modellen, Ansichten, Vorlagen, Tests und anderen Dateien.
Die gesamte Empfehlungslogik für unser Projekt würde sich in einer Anwendung namens recommender
befinden. Führen Sie den folgenden Befehl aus, um diese App zu erstellen.
rishabh@my-ubuntu:~/projects/flix_finder$ python3 manage.py startapp recommender
Mit dem obigen Befehl wird ein neuer Ordner mit dem Namen recommender
erstellt. Die gesamte Logik unserer Anwendung würde in diesem Ordner abgelegt werden.
Es bleibt noch ein weiterer Schritt, bevor wir sagen können, dass unsere Anwendung erfolgreich erstellt wurde. Fahren Sie fort und fügen Sie den Namen der neu erstellten App in die Liste INSTALLED_APPS
unter flix_finder/settings.py
ein.
# 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' ]
Damit haben wir unsere recommender
App erfolgreich erstellt.
Lassen Sie uns nun unsere erste Ansicht erstellen.
In Django sind Ansichten Python-Funktionen, die HTTP-Anfragen empfangen und HTTP-Antworten zurückgeben. Ansichten spielen eine wichtige Rolle bei der Darstellung von Daten für Benutzer basierend auf einer Geschäftslogik.
Erstellen Sie eine neue Methode unter recommender/views.py
. Diese Methode würde Anfragen bearbeiten, die über localhost:8000/
eingehen. Im Moment gibt dieser Endpunkt lediglich eine Hallo-Nachricht zurück.
from django.http import HttpResponse def index(request): return HttpResponse("Hello From Recommender!")
Wir haben die Ansichtsmethode zur Bearbeitung der Anfrage erstellt, aber wir haben (in unserem Projekt) nicht angegeben, welche Endpunkte dieser Ansicht entsprechen. Wir tun dies in den urls.py
Dateien.
Erstellen Sie in der Empfehlungs-App eine neue Datei und nennen Sie sie urls.py
. Hier spezifizieren wir diese Entsprechung zwischen der URL und der Ansichtsmethode.
from django.urls import path from . import views urlpatterns = [ path("", views.index, name = "index") ]
Wir müssen Django nun auf die Datei dieser neuen URL aufmerksam machen. Aktualisieren Sie die Datei flix_finder/urls.py
wie folgt.
from django.urls import path, include urlpatterns = [ path('', include("recommender.urls")), path('admin/', admin.site.urls), ]
Starten Sie Ihren Server, falls noch nicht geschehen, und öffnen Sie localhost:8000
in Ihrem Browser. Sie sollten die Hallo-Nachricht sehen.
Herzlichen Glückwunsch, Sie haben gerade Ihre erste Ansicht erstellt!
Wir sind uns einig, dass das Senden einer Zeichenfolge als Antwort nicht gerade die coolste Sache ist. Stattdessen sollten wir eine richtige HTML-Antwort senden. Und genau zu diesem Zweck werden wir Django-Vorlagen verwenden.
Erstellen Sie ein templates
unter dem recommender
. Der Name dieses neu erstellten Ordners ist besonders, da Django standardmäßig in den Verzeichnissen mit dem Namen templates
nach HTML-Dateien sucht.
Erstellen Sie im neu erstellten Verzeichnis eine neue Datei mit dem Namen index.html
. In diese Datei schreiben wir den HTML-Code, den wir rendern möchten, wenn Benutzer localhost:8000
besuchen.
Da das Schreiben von HTML hier nicht im Vordergrund steht, überspringe ich die Erläuterung dieses Teils und Sie können den HTML-Code einfach von hier kopieren.
Hier sind einige Dinge, die Sie über diese HTML-Datei (oder Django-Vorlage) wissen müssen:
(1) Dieser HTML-Code zeigt vier Dinge auf der Webseite an: Navigationsleiste, Karussell, Filmsuchformular und Filmsuchergebnisse.
(2) Es verwendet die Django-Vorlagensprache, um die Verwendung von Python-Variablen direkt im HTML zu ermöglichen.
(3) Es erwartet die Variable featured_movies
im Kontext (an die Vorlage übergebene Daten) und verwendet sie zur Anzeige des Karussells.
(4) Es wird erwartet, dass die form
mit einem Django-Formularobjekt gefüllt wird, und es wird zur Anzeige des Filmsuchformulars verwendet.
(5) Es erwartet die Variable filtered_movie_list
und verwendet sie, um die Suchergebnisse anzuzeigen.
(6) Es wird außerdem die Variable no_result_error
erwartet, die angibt, ob die Suche zu einer leeren Antwort geführt hat.
Wir müssen auch etwas CSS für das Styling hinzufügen. Erstellen Sie ein static
Verzeichnis unter dem recommender
. Dieser Ordner enthält alle statischen Dateien.
Erstellen Sie eine neue Datei mit dem Namen style.css
und fügen Sie das CSS von dieser URL ein.
Damit verfügen wir über das gesamte erforderliche HTML und CSS. Als nächstes müssen wir das Filmsuchformular erstellen.
Da unsere Vorlage die Bereitstellung eines Formularobjekts erfordert, müssen wir eines erstellen.
Sie sind sich nicht sicher, was Django-Formulare sind? Lesen Sie ChatGPT und erklären Sie dies -
Django-Formulare sind ein Modul im Django-Framework, das zum Erstellen und Arbeiten mit HTML-Formularen verwendet wird. Sie bieten mehrere Vorteile gegenüber der Verwendung einfacher HTML-Formulare:
Erstellen Sie eine Datei mit dem Namen forms.py
im App-Verzeichnis des Empfehlungsgebers. Fügen Sie den folgenden Code hinzu.
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)
Wir haben gerade eine Formularklasse für unser Filmsuchformular erstellt. Dieses Formular enthält zwei Felder, wie in der Klasse beschrieben. Wenn Sie mehr über Formulare erfahren möchten, schauen Sie sich hier an.
Nachdem alle für die Vorlagen erforderlichen Dinge festgelegt sind, müssen wir jetzt unsere Ansichtsmethode aktualisieren, um diese neu erstellte Vorlage zu verwenden.
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)
Starten Sie Ihren Server und gehen Sie zu localhost:8000
. Sie sollten die folgende Seite sehen.
Nachdem alle Ansichten, URLs, Vorlagen und Formulare vorhanden sind, können wir nun die Daten berücksichtigen, mit denen unsere Anwendung arbeiten wird. Unser Programm würde Daten von mehreren Ratingagenturen erfordern (zunächst IMDB).
Leider gibt es keine genau definierte API, über die wir diese Daten abrufen können. Eine Methode, diese Informationen zu erhalten, besteht darin, mit Python Selenium eigene Scraper zu erstellen. Dies würde jedoch mehr Arbeit erfordern, und nicht jeder ist mit solchen Technologien vertraut.
Eine bessere Lösung ist die Nutzung von Drittanbieterdiensten wie BrightData. BrightData macht es einfach, all diese Informationen zu erhalten.
Für diesen ersten Teil verwenden wir einen vorkuratierten IMDB-Datensatz von BrightData. Dies ist einer der vielen Datensätze, die auf BrightData verfügbar sind. So können wir es bekommen.
(1) Eröffnen Sie ein Konto bei BrightData.
(2) Gehen Sie entweder im Browser zu brightdata.com/cp/datasets
oder öffnen Sie das Menü Datasets & WebScraper IDE
auf der linken Seite.
(3) Gehen Sie zum Dataset Marketplace und suchen Sie nach IMDB media dataset
.
(4) Klicken Sie auf „Datensatz anzeigen“ und laden Sie den Beispieldatensatz im CSV-Format herunter.
Benennen Sie die Datei nach dem Herunterladen in IMDB.csv
um und platzieren Sie sie im Ordner recommender/static
. Diese Beispiel-CSV enthält 28 IMDB-Attribute für über 1000 Filme. Unsere Anwendung wird für diesen Teil mit diesem IMDB-Datensatz arbeiten.
Lassen Sie uns die Ansichtsmethode aktualisieren, um Suchanfragen zu verarbeiten.
Alle Suchanfragen aus dem Formular kommen als POST-Anfragen an. Nachdem wir bestätigt haben, dass das Formular ordnungsgemäß ausgefüllt ist, werden wir alle Filme aus der heruntergeladenen CSV-Datei auflisten und diejenigen herausfiltern, die nicht den Filterkriterien entsprechen. So sieht der aktualisierte Code aus.
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)
Die Implementierung der Methoden _getIMDBMovieDataList
und _filter_imdb_movie_list
ist nichts Django-spezifisches, sondern reines Python. Ich verzichte daher darauf, hier darüber zu sprechen. Die gesamte Datei views.py
finden Sie hier .
Herzlichen Glückwunsch, dass Sie diesen Punkt erreicht haben. Wenn Sie alle Schritte ordnungsgemäß ausgeführt haben, sollten Sie in der Lage sein, den Server auszuführen und Suchvorgänge über die Benutzeroberfläche durchzuführen. So würden die Suchergebnisse aussehen.
Der gesamte im Rahmen dieser Serie erstellte Code wird in diesem GitHub-Repository verfügbar sein. Das Endergebnis dieses Teils ist in diesem Zweig mit dem Namen Part1
enthalten.
Es ist immer eine gute Idee, Ihren Code mit dem im Repo vorhandenen Code zu vergleichen, um festzustellen, ob etwas nicht stimmt.
Damit sind wir am Ende des ersten Teils dieser dreiteiligen Serie angelangt. Im nächsten Teil werden wir die WebScraper-IDE von BrightData verwenden, um Daten von anderen Ratingagenturen zu sammeln. Anschließend werden wir unser Formular aktualisieren, sodass Benutzer komplexere Suchen durchführen können.
Wir werden auch die Karussellkomponente dynamisch gestalten!
Bis zum nächsten Mal ... Bis dahin viel Spaß beim Lernen! 🙂