Hangi diziyi veya filmi izleyeceğinize karar vermekte hiç zorlandınız mı? Bir sonraki art arda izlemeniz hakkında karar vermek hiçbir zaman kolay değildir çünkü farklı yayın sağlayıcılarında erişilebilen çok fazla seçenek vardır. Bir sonraki filmimize karar verirken öncelikle çeşitli derecelendirme kuruluşlarının (IMDB gibi) incelemelerine ve derecelendirmelerine güveniyoruz. Ancak bu kurumların çokluğu göz önüne alındığında hangi derecelendirmeye inanılacağını seçmek zor olabilir. Bununla birlikte, bu kuruluşların bir kısmından iyi not almış bir filmi izlemek çoğu zaman daha güvenlidir. Peki böyle bir filmi bulmak zor değil mi? Evet öyle! Bu üç blog serimizde tam da bu sorunu çözecek bir yazılım çözümü oluşturacağız! Flix-Finder adını vereceğimiz bu Django uygulaması, kullanıcının filmleri çeşitli derecelendirme kuruluşlarından aldığı derecelendirmelere göre filtrelemesine olanak tanıyacak. Uygulamamız için gerekli verileri almak amacıyla BrightData'nın hizmetlerini kullanacağız. Lafı daha fazla uzatmadan Flix-Finder'ı oluşturmaya başlayalım. Uygulamanın Kurulumu Bu bölüme başlamadan önce sisteminizde Django'nun kurulu olduğundan emin olun! Sisteminizde Django yüklüyse aşağıdaki komut çalışmalıdır. python3 -m django --version Sisteminizde yüklü değilse Django'yu yüklemek için pip kullanın! python3 -m pip install Django Django projemizi kurarak başlayalım. Aşağıdaki komutu kullanarak yeni bir proje oluşturun. rishabh@my-ubuntu:~/projects$ python3 -m django startproject flix_finder Dizini yeni oluşturulan proje dizini ile değiştirin. Favori kod düzenleyicinizi burada açın. Django tarafından otomatik olarak oluşturulan bu dizinde aşağıdaki dosyaları görmelisiniz. 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 Bu dosyalar hakkında daha fazla bilgi edinmek için Django tarafından sağlanan bu bakın. açıklamaya Kurulumun düzgün bir şekilde tamamlandığından emin olmak için Django sunucusunu çalıştırmayı ve erişmeyi deneyin! localhost:8000 rishabh@my-ubuntu:~/projects/flix_finder$ python3 manage.py runserver Yeni Bir Uygulama Oluşturmak ve İlk Görünümümüz Bir Django uygulaması (veya Django uygulaması), bireysel bir özelliği veya işlevselliği kapsayan daha büyük bir Django projesinin bir bileşenini ifade eder. Django uygulamaları yeniden kullanılabilir ve bağımsız bileşenlerdir. Modeller, görünümler, şablonlar, testler ve diğer dosyalardan oluşurlar. Projemiz için öneri mantığının tümü, adı verilen bir uygulamada bulunacaktır. Bu uygulamayı oluşturmak için aşağıdaki komutu çalıştırın. recommender rishabh@my-ubuntu:~/projects/flix_finder$ python3 manage.py startapp recommender Yukarıdaki komut, adında yeni bir klasör oluşturacaktır. Uygulamamızın tüm mantığı bu klasörün içine girecektir. recommender Uygulamamızın başarıyla oluşturulduğunu söyleyebilmemiz için bir adım daha kaldı. Devam edin ve yeni oluşturulan uygulamanın adını altında bulunan listesine ekleyin. flix_finder/settings.py INSTALLED_APPS # 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' ] Bununla uygulamamızı başarıyla oluşturduk. recommender Şimdi ilk view’ımızı oluşturalım. Django'da görünümler, HTTP isteklerini alan ve HTTP yanıtlarını döndüren Python işlevleridir. Görünümler, bazı iş mantıklarına dayalı olarak verilerin kullanıcılara sunulmasında önemli bir rol oynar. altında yeni bir yöntem oluşturun. Bu yöntem üzerinden gelen istekleri karşılayacaktır. Şimdilik bu uç nokta yalnızca bir merhaba mesajı döndürüyor. recommender/views.py localhost:8000/ from django.http import HttpResponse def index(request): return HttpResponse("Hello From Recommender!") İsteği işlemek için görünüm yöntemini oluşturduk, ancak hangi uç noktaların bu görünüme karşılık geldiğini (projemizde) belirtmedik. Bunu dosyalarında yapıyoruz. urls.py Tavsiye uygulamasının içinde yeni bir dosya oluşturun ve onu olarak adlandırın. Burada URL ile view metodu arasındaki bu eşleşmeyi belirtiyoruz. urls.py from django.urls import path from . import views urlpatterns = [ path("", views.index, name = "index") ] Şimdi Django'nun bu yeni URL dosyasından haberdar olmasını sağlamamız gerekiyor. dosyasını aşağıdaki şekilde güncelleyin. flix_finder/urls.py from django.urls import path, include urlpatterns = [ path('', include("recommender.urls")), path('admin/', admin.site.urls), ] Henüz yapmadıysanız sunucunuzu başlatın ve tarayıcınızda açın. Merhaba mesajını görmelisiniz. localhost:8000 Tebrikler, ilk görünümünüzü oluşturmayı az önce tamamladınız! Şablonları Kullanalım… Kabul edelim… yanıt olarak bir dize göndermek pek hoş bir şey değil. Bunun yerine uygun bir HTML yanıtı göndermeliyiz. Ve tam da bu amaç için Django Şablonlarını kullanacağız. yöneticisinin altında bir dizin oluşturun. Yeni oluşturulan bu klasörün adı, Django'nun varsayılan olarak adlı dizinlerde HTML dosyalarını araması nedeniyle özeldir. recommender templates templates Yeni oluşturulan dizinin içinde adında yeni bir dosya oluşturun. Bu dosyanın içine kullanıcılar ziyaret ettiğinde oluşturmak istediğimiz HTML'yi yazacağız. index.html localhost:8000 Burada asıl odak nokta HTML yazmak olmadığından bu kısmı açıklamayı atlayacağım ve HTML'yi kolayca kopyalayabilirsiniz. buradan Bu HTML dosyası (veya Django şablonu) hakkında bilmeniz gereken bazı şeyler şunlardır: Bu HTML, web sayfasında dört şeyi görüntüler: Gezinme çubuğu, Atlıkarınca, Film Arama Formu ve Film Arama Sonuçları. (1) Python değişkenlerinin doğrudan HTML içinde kullanılmasına izin vermek için Django şablon dilini kullanır. (2) Bağlamda değişkenini bekler (şablona aktarılan veriler) ve bunu atlı karıncayı görüntülemek için kullanır. (3) featured_movies değişkeninin bir Django Form nesnesiyle doldurulmasını bekler ve bunu Film Arama Formunu görüntülemek için kullanır. (4) form değişkenini bekler ve bunu arama sonuçlarını görüntülemek için kullanır. (5) filtered_movie_list Ayrıca, aramanın boş bir yanıtla sonuçlanıp sonuçlanmadığını gösteren değişkenini de bekler. (6) no_result_error Ayrıca stillendirme için biraz CSS eklememiz gerekecek. dizini altında bir dizin oluşturun. Bu klasör tüm statik dosyaları tutacaktır. recommender static adında yeni bir dosya oluşturun ve URL'deki CSS'yi yapıştırın. style.css bu Bununla birlikte, gerekli tüm HTML ve CSS'ye sahibiz. Daha sonra Film Arama formunu oluşturmamız gerekiyor. Film Arama Formu Oluşturma Şablonumuz bir form nesnesi sağlamamızı gerektirdiğinden bir tane oluşturmamız gerekecek. Django Formlarının ne olduğundan emin değil misiniz? ChatGPT'yi okuyun, bunu açıklayın - Django formları, Django çerçevesinde HTML formları oluşturmak ve bunlarla çalışmak için kullanılan bir modüldür. Düz HTML formlarını kullanmaya göre çeşitli avantajlar sağlarlar: HTML'nin otomatik olarak oluşturulması. Bir Django form sınıfı tanımlarsınız ve Django bunu bir HTML formu olarak işler. Verilerin doğrulanması. Django formları gönderilen verileri doğrular ve kaydetmeden önce temizler. Verileri formlara bağlama. Mevcut verileri, düzenleme amacıyla kullanıcıya görüntülenmek üzere bir forma bağlayabilirsiniz. Tavsiye edenin uygulama dizininde adında bir dosya oluşturun. Aşağıdaki kodu buna ekleyin. 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) Az önce yaptığımız şey, Film Arama Formumuz için bir form sınıfı oluşturmaktı. Bu form sınıfta anlatıldığı gibi iki alan içerecektir. Formlar hakkında daha fazla bilgi edinmek istiyorsanız göz atın. buna Dizin Görünümünü Güncelleme Şablonlar için gereken her şey ayarlandığında, artık bu yeni oluşturulan şablonu kullanmak için görünüm yöntemimizi güncellememiz gerekiyor. 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) Sunucunuzu başlatın ve adresine gidin. Aşağıdaki sayfayı görmelisiniz. localhost:8000 BrightData'dan IMDB Verileri Tüm görünümler, URL'ler, şablonlar ve formlar mevcut olduğundan artık uygulamamızın üzerinde çalışacağı verileri dikkate alabiliriz. Programımız, başlangıçta birden fazla derecelendirme kuruluşundan (IMDB) veri gerektirecektir. Ne yazık ki bu verileri alabileceğimiz iyi tanımlanmış bir API yok. Bu bilgiyi elde etmenin bir yöntemi Python Selenium kullanarak kendi kazıyıcılarımızı oluşturmaktır. Ancak bu daha fazla çalışma gerektirecektir ve herkes bu tür teknolojilerden memnun değildir. BrightData gibi üçüncü taraf hizmetleri kullanmak daha iyi bir çözümdür. BrightData tüm bu bilgilerin elde edilmesini kolaylaştırır. Bu 1. bölüm için BrightData'nın önceden seçilmiş bir IMDB veri kümesini kullanacağız. Bu, BrightData'da bulunan birçok veri kümesinden biridir. Bu şekilde elde edebiliriz. BrightData'da bir hesap için kaydolun. (1) Tarayıcıdan adresine gidin veya soldan menüsünü açın. (2) brightdata.com/cp/datasets Datasets & WebScraper IDE Dataset Marketplace'e gidin ve arayın. (3) IMDB media dataset Veri Kümesini Görüntüle'ye tıklayın ve örnek veri kümesini CSV formatında indirin. (4) İndirdikten sonra dosyayı olarak yeniden adlandırın ve klasörün içine yerleştirin. Bu örnek CSV, 1000'den fazla film için 28 IMDB özelliği içerir. Uygulamamız bu kısım için bu IMDB veri seti üzerinde çalışacaktır. IMDB.csv recommender/static Form Gönderimi Almak İçin Dizin Görünümünü Güncelleme Arama isteklerini işlemek için görünüm yöntemini güncelleyelim. Formdaki tüm arama istekleri POST istekleri olarak gelir. Formun doğru şekilde doldurulduğunu onayladıktan sonra indirilen CSV dosyasındaki tüm filmleri listeleyeceğiz ve filtre kriterlerine uymayanları filtreleyeceğiz. Güncellenen kodun nasıl göründüğü aşağıda açıklanmıştır. 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) ve yöntemlerinin uygulanması Django'ya özgü bir şey değildir ve yalnızca saf Python'dur. Bu nedenle burada bunun hakkında konuşmayı atlıyorum. dosyasının tamamını bulabilirsiniz. _getIMDBMovieDataList _filter_imdb_movie_list views.py burada Son ürün Bu noktaya ulaştığınız için tebrikler. Tüm adımları doğru bir şekilde izlediyseniz, sunucuyu çalıştırabilmeniz ve kullanıcı arayüzü üzerinden arama yapabilmeniz gerekir. Arama sonuçlarının nasıl görüneceği aşağıda açıklanmıştır. Bu Serinin Kodu Bu serinin bir parçası olarak oluşturulan tüm kodlar GitHub deposunda mevcut olacaktır. Bu bölümün nihai sonucu adlı dalda yer almaktadır. bu Part1 bu Bir şeylerin yanlış olup olmadığını kontrol etmek için kodunuzu depoda bulunan kodla çapraz kontrol etmek her zaman iyi bir fikirdir. Son sözler Böylelikle üç bölümlük serimizin ilk bölümünün sonuna gelmiş bulunuyoruz. Bir sonraki bölümde diğer derecelendirme kuruluşlarından veri toplamak için BrightData'nın WebScraper IDE'sini kullanacağız. Daha sonra formumuzu güncelleyeceğiz, böylece kullanıcıların daha karmaşık aramalar yapmasına olanak tanıyacağız. Ayrıca Carousel bileşenini de dinamik hale getireceğiz! Bir dahaki sefere görüşürüz… O zamana kadar, Mutlu Öğrenmeler! 🙂