Bạn đã bao giờ đấu tranh để quyết định xem chương trình truyền hình hoặc bộ phim nào tiếp theo chưa? Đưa ra quyết định về lần xem say sưa tiếp theo của bạn chưa bao giờ là điều dễ dàng vì có rất nhiều tùy chọn có thể truy cập trên các nhà cung cấp dịch vụ phát trực tuyến khác nhau. Khi quyết định chọn bộ phim tiếp theo của mình, chúng tôi chủ yếu dựa vào đánh giá và xếp hạng từ một số cơ quan xếp hạng (như IMDB). Tuy nhiên, việc chọn xếp hạng nào để tin tưởng có thể khó khăn do có quá nhiều tổ chức này. Phải nói rằng, việc xem một bộ phim đã nhận được điểm tốt từ một số tổ chức này thường sẽ an toàn hơn. Nhưng tìm một bộ phim như vậy có khó không? Vâng, đúng vậy! Trong loạt ba blog này, chúng tôi sẽ tạo ra một giải pháp phần mềm để giải quyết vấn đề chính xác này! Ứng dụng Django này, mà chúng tôi sẽ gọi là Flix-Finder, sẽ cho phép người dùng lọc phim dựa trên xếp hạng từ một số cơ quan xếp hạng. Chúng tôi sẽ sử dụng các dịch vụ của BrightData để lấy dữ liệu cần thiết cho ứng dụng của chúng tôi. Vì vậy, không cần phải chần chừ thêm nữa, hãy bắt đầu xây dựng Flix-Finder. Thiết lập ứng dụng Trước khi bắt đầu với phần này, hãy đảm bảo rằng Django đã được cài đặt trong hệ thống của bạn! Lệnh sau sẽ hoạt động nếu Django được cài đặt trong hệ thống của bạn. python3 -m django --version Sử dụng pip để cài đặt Django nếu nó chưa được cài đặt trong hệ thống của bạn! python3 -m pip install Django Hãy để chúng tôi bắt đầu bằng cách thiết lập dự án Django của chúng tôi. Tạo một dự án mới bằng cách sử dụng lệnh sau. rishabh@my-ubuntu:~/projects$ python3 -m django startproject flix_finder Thay đổi thư mục thành thư mục dự án mới tạo . Mở trình chỉnh sửa mã yêu thích của bạn tại đây. Bạn sẽ thấy các tệp sau trong thư mục này do Django tự động tạo. 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 Để biết thêm về các tệp này, hãy tham khảo này do Django cung cấp. giải thích Hãy thử chạy máy chủ Django và truy cập để đảm bảo rằng quá trình thiết lập đã được hoàn tất đúng cách! localhost:8000 rishabh@my-ubuntu:~/projects/flix_finder$ python3 manage.py runserver Tạo một ứng dụng mới và Chế độ xem đầu tiên của chúng tôi Ứng dụng Django (hoặc ứng dụng Django) đề cập đến một thành phần của dự án Django lớn hơn gói gọn một tính năng hoặc chức năng riêng lẻ. Ứng dụng Django là các thành phần độc lập và có thể tái sử dụng. Chúng bao gồm các mô hình, dạng xem, mẫu, thử nghiệm và các tệp khác. Tất cả logic của người giới thiệu cho dự án của chúng tôi sẽ nằm trong một ứng dụng có tên là . Để tạo ứng dụng này, hãy chạy lệnh sau. recommender rishabh@my-ubuntu:~/projects/flix_finder$ python3 manage.py startapp recommender Lệnh trên sẽ tạo một thư mục mới có tên là . Tất cả logic của ứng dụng của chúng tôi sẽ nằm trong thư mục này. recommender Còn một bước nữa trước khi chúng ta có thể nói rằng ứng dụng của chúng ta đã được tạo thành công. Hãy tiếp tục và thêm tên của ứng dụng mới tạo vào danh sách có trong . 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' ] Với điều này, chúng tôi đã tạo thành công ứng dụng của mình. recommender Bây giờ, chúng ta hãy tạo chế độ xem đầu tiên. Trong Django, chế độ xem là các hàm Python nhận yêu cầu HTTP và trả về phản hồi HTTP. Lượt xem đóng một vai trò quan trọng trong việc trình bày dữ liệu cho người dùng dựa trên một số logic nghiệp vụ. Tạo một phương thức mới trong . Phương thức này sẽ phục vụ các yêu cầu đến qua . Hiện tại, điểm cuối này chỉ trả về một thông báo xin chào. recommender/views.py localhost:8000/ from django.http import HttpResponse def index(request): return HttpResponse("Hello From Recommender!") Chúng tôi đã tạo phương thức xem để xử lý yêu cầu, nhưng chúng tôi chưa chỉ định (trong dự án của mình) điểm cuối nào tương ứng với chế độ xem này. Chúng tôi làm điều này trong các tệp urls.py Tạo một tệp mới bên trong ứng dụng đề xuất và đặt tên là . Ở đây, chúng tôi chỉ định sự tương ứng này giữa URL và phương thức xem. urls.py from django.urls import path from . import views urlpatterns = [ path("", views.index, name = "index") ] Bây giờ chúng ta cần làm cho Django biết về tệp của URL mới này. Cập nhật tệp thành tệp sau. flix_finder/urls.py from django.urls import path, include urlpatterns = [ path('', include("recommender.urls")), path('admin/', admin.site.urls), ] Khởi động máy chủ của bạn, nếu chưa, và mở trên trình duyệt của bạn. Bạn sẽ thấy tin nhắn xin chào. localhost:8000 Xin chúc mừng, bạn vừa hoàn thành việc tạo chế độ xem đầu tiên của mình! Hãy để chúng tôi sử dụng các mẫu… Hãy để chúng tôi đồng ý… gửi một chuỗi dưới dạng phản hồi không phải là điều thú vị nhất. Thay vào đó, chúng ta nên gửi một phản hồi HTML thích hợp. Và với mục đích chính xác này, chúng tôi sẽ sử dụng Mẫu Django. Tạo một thư mục dưới giám đốc . Tên của thư mục mới được tạo này rất đặc biệt vì Django mặc định tìm kiếm các tệp HTML trong các thư mục có tên là . templates recommender templates Tạo một tệp mới có tên bên trong thư mục vừa tạo. Bên trong tệp này, chúng tôi sẽ viết HTML mà chúng tôi muốn hiển thị khi người dùng truy cập . index.html localhost:8000 Vì viết HTML không phải là trọng tâm chính ở đây nên tôi sẽ bỏ qua việc giải thích phần đó và bạn chỉ cần sao chép HTML từ . đây Dưới đây là một số điều bạn cần biết về tệp HTML này (hoặc mẫu Django) - HTML này hiển thị bốn nội dung trên trang web - Thanh điều hướng, Băng chuyền, Biểu mẫu tìm kiếm phim và Kết quả tìm kiếm phim. (1) Nó sử dụng ngôn ngữ mẫu Django để cho phép sử dụng các biến Python trực tiếp bên trong HTML. (2) Nó mong đợi biến trong ngữ cảnh (dữ liệu được chuyển đến mẫu) và sẽ sử dụng nó để hiển thị băng chuyền. (3) featured_movies Nó mong muốn biến được lấp đầy bằng đối tượng Biểu mẫu Django và sẽ sử dụng nó để hiển thị Biểu mẫu tìm kiếm phim. (4) form Nó mong đợi và sẽ sử dụng nó để hiển thị kết quả tìm kiếm. (5) filtered_movie_list Nó cũng mong đợi biến cho biết liệu tìm kiếm có dẫn đến phản hồi trống hay không. (6) no_result_error Chúng tôi cũng sẽ cần thêm một số CSS để tạo kiểu. Tạo một thư mục trong thư mục . Thư mục này sẽ chứa tất cả các tệp tĩnh. static recommender Tạo một tệp mới có tên và dán CSS từ . style.css URL này Với điều này, chúng tôi có tất cả HTML và CSS cần thiết. Tiếp theo, chúng ta cần tạo biểu mẫu Tìm kiếm phim. Tạo biểu mẫu tìm kiếm phim Vì mẫu của chúng tôi yêu cầu chúng tôi cung cấp một đối tượng biểu mẫu nên chúng tôi sẽ cần tạo một đối tượng. Bạn không chắc Biểu mẫu Django là gì? Đọc ChatGPT giải thích điều này - Các biểu mẫu Django là một mô-đun trong khung Django được sử dụng để tạo và làm việc với các biểu mẫu HTML. Chúng cung cấp một số lợi thế so với việc sử dụng các biểu mẫu HTML đơn giản: Tự động kết xuất HTML. Bạn định nghĩa một lớp biểu mẫu Django và Django hiển thị nó dưới dạng biểu mẫu HTML. Xác thực dữ liệu. Biểu mẫu Django xác thực dữ liệu đã gửi và làm sạch dữ liệu đó trước khi lưu. Liên kết dữ liệu với các biểu mẫu. Bạn có thể liên kết dữ liệu hiện có với một biểu mẫu để hiển thị cho người dùng chỉnh sửa. Tạo một tệp có tên là bên trong thư mục ứng dụng của người giới thiệu. Thêm đoạn mã sau vào nó. 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) Những gì chúng tôi vừa làm là tạo một lớp biểu mẫu cho Biểu mẫu tìm kiếm phim của chúng tôi. Biểu mẫu này sẽ chứa hai trường như được mô tả trong lớp. Nếu bạn muốn biết thêm về các biểu mẫu, hãy xem . phần này Cập nhật Chế độ xem Chỉ mục Với tất cả những thứ cần thiết cho mẫu được thiết lập, bây giờ chúng tôi cần cập nhật phương thức xem của mình để sử dụng mẫu mới được tạo này. 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) Khởi động máy chủ của bạn và đi tới . Bạn sẽ thấy trang sau. localhost:8000 Dữ liệu IMDB từ BrightData Với tất cả các chế độ xem, URL, mẫu và biểu mẫu đã có, giờ đây chúng ta có thể xem xét dữ liệu mà ứng dụng của chúng ta sẽ hoạt động trên đó. Chương trình của chúng tôi sẽ yêu cầu dữ liệu từ nhiều cơ quan xếp hạng (IMDB, để bắt đầu). Thật không may, không có API được xác định rõ ràng để chúng tôi có thể truy xuất dữ liệu này. Một phương pháp để có được thông tin này là tạo trình dọn dẹp của riêng chúng tôi bằng Python Selenium. Tuy nhiên, điều này sẽ đòi hỏi nhiều công việc hơn và không phải ai cũng cảm thấy thoải mái với những công nghệ như vậy. Một giải pháp tốt hơn là sử dụng các dịch vụ của bên thứ ba như BrightData. BrightData giúp bạn dễ dàng có được tất cả thông tin này. Đối với phần đầu tiên này, chúng tôi sẽ sử dụng bộ dữ liệu IMDB được tuyển chọn trước từ BrightData. Đây là một trong nhiều bộ dữ liệu có sẵn trên BrightData. Đây là cách chúng ta có thể có được nó. Đăng ký tài khoản trên BrightData. (1) Truy cập từ trình duyệt hoặc mở menu từ bên trái. (2) brightdata.com/cp/datasets Datasets & WebScraper IDE Truy cập Dataset Marketplace và tìm kiếm . (3) IMDB media dataset Nhấp vào Xem tập dữ liệu và tải xuống tập dữ liệu mẫu ở định dạng CSV. (4) Sau khi tải xuống, hãy đổi tên tệp thành và đặt tệp vào trong thư mục . CSV mẫu này chứa 28 thuộc tính IMDB cho hơn 1000 phim. Ứng dụng của chúng tôi sẽ hoạt động trên bộ dữ liệu IMDB này cho phần này. IMDB.csv recommender/static Cập nhật Chế độ xem Chỉ mục để Nhận Biểu mẫu Gửi Hãy để chúng tôi cập nhật phương thức xem để xử lý các yêu cầu tìm kiếm. Tất cả các yêu cầu tìm kiếm từ biểu mẫu đến dưới dạng yêu cầu POST. Sau khi xác nhận rằng biểu mẫu đã được điền chính xác, chúng tôi sẽ liệt kê tất cả phim từ tệp CSV đã tải xuống và lọc ra những phim không phù hợp với tiêu chí lọc. Đây là cách mã được cập nhật. 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) Việc triển khai các phương thức và không có gì cụ thể đối với Django và chỉ là Python thuần túy. Do đó tôi bỏ qua nói về điều đó ở đây. Bạn có thể tìm thấy toàn bộ tệp . _getIMDBMovieDataList _filter_imdb_movie_list views.py tại đây Sản phẩm cuối cùng Chúc mừng bạn đã đạt đến điểm này. Nếu bạn đã thực hiện đúng tất cả các bước, bạn sẽ có thể chạy máy chủ và thực hiện tìm kiếm thông qua giao diện người dùng. Đây là cách kết quả tìm kiếm sẽ trông như thế nào. Mã cho sê-ri này Tất cả mã được tạo như một phần của loạt bài này sẽ có sẵn trên kho lưu trữ GitHub . Kết quả cuối cùng của phần này được chứa trong nhánh có tên . này này Part1 Bạn luôn nên kiểm tra chéo mã của mình với mã hiện có trên repo để kiểm tra xem có gì sai không. Kết luận Với điều này, chúng ta đi đến phần cuối của phần đầu tiên của loạt bài gồm ba phần này. Trong phần tiếp theo, chúng tôi sẽ sử dụng IDE WebScraper của BrightData để thu thập dữ liệu từ các cơ quan xếp hạng khác. Sau đó, chúng tôi sẽ cập nhật biểu mẫu của mình, do đó cho phép người dùng thực hiện các tìm kiếm phức tạp hơn. Chúng tôi cũng sẽ làm cho thành phần Carousel trở nên năng động! Hẹn gặp lại bạn lần sau… Đến lúc đó, Chúc bạn học tập vui vẻ! 🙂