您是否曾经苦于决定接下来要看哪部电视节目或电影?做出关于下一次观看的决定绝非易事,因为不同的流媒体提供商有很多选择。 在决定下一部电影时,我们主要依赖多家评级机构(例如 IMDB)的评论和评级。然而,鉴于这些机构数量众多,选择相信哪个评级可能会很困难。 话虽如此,观看一部获得许多此类组织好评的电影通常更安全。但找这样的电影不是很困难吗?是的! 在这个由三个博客组成的系列中,我们将创建一个软件解决方案来解决这个确切的问题!这个 Django 应用程序(我们将其称为 Flix-Finder)将允许其用户根据多个评级机构的评级来过滤电影。 我们将使用 BrightData 的服务来获取我们的应用程序所需的数据。 言归正传,让我们开始构建 Flix-Finder。 设置应用程序 在开始本节之前,请确保您的系统中已安装 Django! 如果您的系统中安装了 Django,则以下命令应该有效。 python3 -m django --version 如果你的系统中没有安装Django,请使用pip来安装它! python3 -m pip install Django 让我们首先设置 Django 项目。使用以下命令创建一个新项目。 rishabh@my-ubuntu:~/projects$ python3 -m django startproject flix_finder 将目录更改为新创建的项目目录 。在这里打开您最喜欢的代码编辑器。您应该在此目录中看到 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 要了解有关这些文件的更多信息,请参阅 Django 提供的 。 说明 尝试运行 Django 服务器并访问 以确保设置正确完成! localhost:8000 rishabh@my-ubuntu:~/projects/flix_finder$ python3 manage.py runserver 创建一个新应用程序和我们的第一个视图 Django 应用程序(或 Django 应用程序)是指封装单个特性或功能的大型 Django 项目的组件。 Django 应用程序是可重用且独立的组件。它们由模型、视图、模板、测试和其他文件组成。 我们项目的所有推荐逻辑都将驻留在名为 的应用程序中。要创建此应用程序,请运行以下命令。 recommender rishabh@my-ubuntu:~/projects/flix_finder$ python3 manage.py startapp recommender 上面的命令将创建一个名为 的新文件夹。我们应用程序的所有逻辑都将位于此文件夹内。 recommender 在我们可以说我们的应用程序已成功创建之前,还剩下一步。继续将新创建的应用程序的名称添加到 下的 列表中。 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' ] 至此,我们已经成功创建了 应用程序。 recommender 现在,让我们创建第一个视图。 在 Django 中,视图是接收 HTTP 请求并返回 HTTP 响应的 Python 函数。视图在基于某些业务逻辑向用户呈现数据方面发挥着重要作用。 在 下创建一个新方法。此方法将为来自 请求提供服务。目前,该端点仅返回一条 hello 消息。 recommender/views.py localhost:8000/ from django.http import HttpResponse def index(request): return HttpResponse("Hello From Recommender!") 我们已经创建了用于处理请求的视图方法,但我们尚未指定(在我们的项目中)哪些端点对应于该视图。我们在 文件中执行此操作。 urls.py 在推荐应用程序中创建一个新文件,并将其命名为 。在这里,我们指定了 URL 和视图方法之间的对应关系。 urls.py from django.urls import path from . import views urlpatterns = [ path("", views.index, name = "index") ] 现在我们需要让 Django 知道这个新 URL 的文件。将文件 更新为以下内容。 flix_finder/urls.py from django.urls import path, include urlpatterns = [ path('', include("recommender.urls")), path('admin/', admin.site.urls), ] 启动服务器(如果尚未启动),然后在浏览器上打开 。您应该会看到问候消息。 localhost:8000 恭喜,您刚刚完成第一个视图的创建! 让我们使用模板...... 让我们同意......发送字符串作为响应并不是最酷的事情。我们应该发送正确的 HTML 响应。为此,我们将使用 Django 模板。 在 director下创建一个目录 。这个新创建的文件夹的名称很特殊,因为 Django 默认在名为 的目录中搜索 HTML 文件。 recommender templates templates 在新创建的目录中创建一个名为 的新文件。在此文件中,我们将编写当用户访问 时要呈现的 HTML。 index.html localhost:8000 由于编写 HTML 不是这里的主要焦点,因此我将跳过解释该部分,您只需从 复制 HTML 即可。 此处 以下是您需要了解的有关此 HTML 文件(或 Django 模板)的一些事项 - 此 HTML 在网页上显示四个内容 - 导航栏、轮播、电影搜索表单和电影搜索结果。 (1) 它使用 Django 模板语言,允许直接在 HTML 中使用 Python 变量。 (2) 它期望上下文中存在 变量(传递给模板的数据),并将使用它来显示轮播。 (3) featured_movies 它期望用 Django Form 对象填充 变量,并使用它来显示电影搜索表单。 (4) form 它需要 变量并将使用它来显示搜索结果。 (5) filtered_movie_list 它还需要 变量来指示搜索结果是否为空响应。 (6) no_result_error 我们还需要添加一些 CSS 来设置样式。在 目录下创建一个 目录。该文件夹将保存所有静态文件。 recommender static 创建一个名为 的新文件,并粘贴 中的 CSS。 style.css 此 URL 至此,我们已经准备好了所有必需的 HTML 和 CSS。接下来,我们需要创建电影搜索表单。 创建电影搜索表单 由于我们的模板要求我们提供一个表单对象,因此我们需要创建一个。 不确定什么是 Django Forms?阅读 ChatGPT 解释这一点 - Django 表单是 Django 框架中的一个模块,用于创建和使用 HTML 表单。与使用纯 HTML 表单相比,它们具有以下几个优点: 自动渲染 HTML。您定义一个 Django 表单类,Django 将其呈现为 HTML 表单。 数据验证。 Django 表单会验证提交的数据并在保存之前对其进行清理。 将数据绑定到表单。您可以将现有数据绑定到表单以显示给用户进行编辑。 在推荐者的应用程序目录中创建一个名为 的文件。将以下代码添加到其中。 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) 我们刚刚所做的是为我们的电影搜索表单创建一个表单类。该表单将包含类中描述的两个字段。如果您想了解更多有关表格的信息,请查看 。 此 更新索引视图 设置模板所需的所有内容后,现在我们需要更新视图方法以使用这个新创建的模板。 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) 启动服务器,然后前往 。您应该看到以下页面。 localhost:8000 来自 BrightData 的 IMDB 数据 所有视图、URL、模板和表单都就位后,我们现在可以考虑应用程序将操作的数据。我们的计划需要来自多个评级机构(首先是 IMDB)的数据。 不幸的是,没有明确定义的 API 可供我们检索此数据。获取此信息的一种方法是使用 Python Selenium 创建我们自己的抓取工具。然而,这需要更多的工作,而且并不是每个人都对这种技术感到满意。 更好的解决方案是使用 BrightData 等第三方服务。 BrightData 可以轻松获取所有这些信息。 对于第 1 部分,我们将使用 BrightData 预先整理的 IMDB 数据集。这是 BrightData 上提供的众多数据集之一。这就是我们可以得到它的方法。 注册 BrightData 帐户。 (1) 从浏览器访问 或从左侧打开 菜单。 (2) brightdata.com/cp/datasets Datasets & WebScraper IDE 进入Dataset Marketplace,搜索 。 (3) IMDB media dataset 单击“查看数据集”,下载 CSV 格式的示例数据集。 (4) 下载后,将文件重命名为 ,并将其放入 文件夹中。此示例 CSV 包含 1000 多部电影的 28 个 IMDB 属性。我们的应用程序将在此部分的 IMDB 数据集上运行。 IMDB.csv recommender/static 更新索引视图以接收表单提交 让我们更新视图方法来处理搜索请求。 来自表单的所有搜索请求均以 POST 请求形式到达。确认表格填写正确后,我们将列出下载的 CSV 文件中的所有电影,并过滤掉那些不符合过滤条件的电影。以下是更新后的代码的外观。 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) 方法 和 的实现与 Django 无关,只是纯 Python。因此我在这里跳过谈论这个。完整的 文件可以 找到。 _getIMDBMovieDataList _filter_imdb_movie_list views.py 在这里 完成品 恭喜您达到了这一点。如果您正确执行了所有步骤,您应该能够运行服务器并通过 UI 执行搜索。搜索结果如下所示。 本系列的代码 作为本系列的一部分创建的所有代码都将在 GitHub 存储库中提供。该部分的最终结果包含在名为 的 中。 此 Part1 分支 将您的代码与存储库中的代码进行交叉检查以检查是否有问题始终是一个好主意。 结束语 至此,我们结束了这个由三部分组成的系列的第一部分。在下一部分中,我们将使用 BrightData 的 WebScraper IDE 收集其他评级机构的数据。然后我们将更新我们的表单,从而允许用户执行更复杂的搜索。 我们还将使 Carousel 组件变得动态! 下次见……到此为止,祝您学习愉快! 🙂