如何使用 Vue.js 和 Django 构建 Web 应用程序:一个完整的指南

阅读时长 25 分钟读完

本文将介绍如何使用 Vue.js 和 Django 构建一个 Web 应用程序。Vue.js 是一个流行的 JavaScript 框架,用于构建交互性的前端应用程序,而 Django 是一个流行的 Python Web 框架,用于构建 Web 应用程序后端。本文将向你展示如何集成这两个框架以创建一个完整的 Web 应用程序。

准备工作

在开始之前,确保您已安装以下软件:

  • Python 3.x
  • Node.js
  • vue-cli

构建后端

我们将从构建后端开始,因为这是提供数据和服务的地方。在本文中,我们将使用 Django,因为它是广泛使用的 Web 框架之一。

创建项目

我们将首先创建一个 Django 项目。在命令行界面中输入以下命令:

它将创建一个名为 vue-django 的文件夹,其中包含 Django 项目的主目录。

创建应用

在 Django 中,应用是项目中的可重用组件。现在,我们将为我们的项目创建一个应用。在项目的根目录中运行以下命令:

它将创建一个名为“api”的目录,其中包含该应用程序的主要代码。

向应用添加模型

模型是 Django 中用来描述数据模板的类。它们定义了应用程序中将存储的数据以及如何组织该数据。在我们的示例中,我们将创建一个简单的模型,用于存储待办事项。

打开 api/models.py 文件,输入以下内容:

我们定义了一个 TodoItem 模型,它保存待办事项的标题和完成状态。我们使用 CharField 存储标题,它允许我们最多使用 100 个字符,BooleanField 用于存储完成状态。

创建视图

视图是将数据传递到前端的地方。视图对来自 URL 的请求进行响应,并向前端返回数据。在我们的应用中,我们将使用 Django 的 REST 框架创建视图。REST API 是一种用于在客户端和服务器之间传递数据的 Web API,它使用 HTTP 请求处理数据。通过使用 REST,我们可以构建出高度灵活和可扩展的接口,具有广泛的兼容性。

打开 api/views.py 文件,输入以下内容:

在这个视图类中,我们使用了 viewset,可以认为是一个 Django 视图的增强版。它提供了更多的功能,如自动实现常见的 REST 路由。我们的 TodoItemViewSet viewset 继承了 ModelViewSet,这意味着该视图集支持标准的 CRUD 功能。我们还为 queryset 定义了一个查询集,这将返回所有 TodoItem 实例。serializer_class 将在下一步中创建。

创建序列化器

序列化器将模型实例转换为 JSON 格式,以便与前端进行通信。在我们的应用中,我们将使用 Django 的 REST 框架创建序列化器。

打开 api/serializers.py 文件,输入以下内容:

在这个序列化器中,我们定义了一个 Meta 类,它指定了模型和我们希望序列化器公开的所有字段。由于我们希望在前端中显示所有的字段,因此我们使用 fields = 'all' 指定了所有字段。

视图集添加路由

视图集必须添加到路由中,以便 Django 能够找到它们。创建 api/urls.py 文件,并输入以下内容:

-- -------------------- ---- -------
---- ----------- ------ ----- -------
---- -------------- ------ -------
---- ------ ------ -

------ - -----------------------
------------------------------ ----------------

----------- - -
    -------- ----------------------
-

我们使用 Django 的 REST 框架中的 routers 定义路由器,并为 TodoItemViewSet 创建了一个默认路由器。loaders.urls 模块的主要功能是与 django.urls 模块类似,提供 URL 对象。我们可以通过将 REST 框架路由器添加到 api/urls.py 文件中,并通过 include 函数将它们包含在应用中来包含路由。

运行后端服务器

在 cmd 中,输入以下命令来运行本地 Django Web 服务器:

现在,在浏览器中打开 http://localhost:8000/,你将看到 Django 的默认欢迎页面。

构建前端

创建项目

使用vue-cli创建新项目,打开 cmd,运行以下命令:

我们将使用默认设置,所以一路回车直到项目生成完毕。

安装依赖

在项目根目录下,依次输入以下命令安装依赖:

  • vue-router: 是 Vue.js 的官方路由管理器,用于构建基于 Vue.js 的单页应用程序。
  • axios: 是一个基于 promise 的 HTTP 库,用于处理 Web 应用中的异步请求,由于在本文中要向后端 API 发送请求,因此我们需要安装它。
  • bootstrap: 是一个流行的前端框架,包含了许多重要的 CSS 样式和 JavaScript 插件,它可以帮助您快速构建美观的用户界面。
  • jquery 和 popper.js:是 Bootstrap 所需的依赖项。

配置项目

打开 frontend/src/main.js,添加以下代码块:

-- -------------------- ---- -------
------ ----------------------------------
------ --------------------------------------
------ ---------------------
------ --- ---- -----
------ --- ---- -----------
------ ------ ---- ----------

------------------------ - -----

--- -----
  -------
  ------- - -- ------
-----------------

这段代码引入了我们需要的依赖,并通过 import 语句导入了相关文件。在 new Vue 实例中,我们添加了路由和 App 组件并将其渲染到 #app div 中。

创建待办事项组件

我们的应用程序将显示待办事项列表。为此,我们需要创建一个 TodoList 组件,并将其添加到我们的应用程序中。

在 frontend/src/components 文件夹中创建一个名为 TodoList.vue 的新文件,输入以下内容:

-- -------------------- ---- -------
----------
  ---- ------------------------
    ---- ------------
      ---- -----------------
        -------- ---------
      ------
      ---- -----------------
        ------------ -------------- ---------- ----------- ------ ---------------- ------------------
      ------
    ------
    ----
    ---- ------------------
      ---- ----------------- ------ -- ---------- -------------
        ---- ------------
          ---- -----------------
            ----- --------- ------------ ------------------ ----- -------------- ---------
          ------
          ---- --------------- ------------
            ------------ ------ ----- ------- ------- ---- ------------ -- ---------- ----------- --------------------------
            ------- ---------- ---------- ------- -------------------------------------------------
          ------
        ------
        ----
      ------
    ------
    ---- -------
      ----------
    ------
  ------
-----------

--------
------ ----- ---- -------

------ ------- -
  ----- -----------
  ---- -- -
    ------ -
      ---------- ---
      ---------- ----
    -
  --
  -------- -
    ------------- -------- -- -
      -----
        -----------------------------------------
        -------------- -- -
          -------------- - -------------
        --
        ----------- -- -
          -------------- - -----
        --
    --
    --------------- -------- ---------- -
      -- ------------- --- ---- --- ---- -- ------ ----------------------- -
        ----------------------------------------------------------------------------------------
      -
    -
  --
  ------- -- -
    -------------------
  -
-
---------

-------
---------- -
  ---------------- -------------
-
--------

这个组件包含以下内容:

  • 一个显示待办事项列表的容器。

  • 一个显示标题的

    元素和一个链接,此链接用于添加新的待办事项。

  • 一个循环,用于显示添加到 todoItems 数据数组的每个待办事项。

  • 一个条件语句,用于检查是否 todoItems 数组已加载。如果已加载,下列内容将显示:

    • 显示待办事项的标题
    • 一个图标,用于编辑待办事项。
    • 一个删除按钮,用于删除待办事项。
    • 用于分隔每个待办事项的水平线。
  • 如果数据数组尚未加载,则显示一个“加载中…”消息。

创建添加待办事项组件

我们还需要创建组件以添加新的待办事项。为此,我们将创建一个名为 AddTodo.vue 的组件。

在 frontend/src/components 文件夹中创建一个名为 AddTodo.vue 的新文件,输入以下内容:

-- -------------------- ---- -------
----------
  ---- ------------------
    ---- ------------
      ---- ------------------
        ------- ---- ---------
        ----
        ----- ---------------------------------
          ---- -------------------
            ------ -------------------------
            ------ ----------- -------------------- ---------- ----------------
          ------
          ------- ------------- ---------- ----------------------------
        -------
      ------
    ------
  ------
-----------

--------
------ ----- ---- -------

------ ------- -
  ----- ----------
  ---- -- -
    ------ -
      ------ --
    -
  --
  -------- -
    -------------- -- -
      ----------------------------------------------- -
        ------ -----------
        ---------- -----
      ---------- -- -
        ----------- ---- ----- ---------------
        ---------- - --
      -------------- -- -
        --------------------
        ------------ ------ ---- -------
      --
    -
  -
-
---------

我们将使用相同的行间样式来应用相同的样式。

创建编辑待办事项组件

我们还需要创建组件以编辑待办事项。在 frontend/src/components 文件夹中创建命名为 EditTodo.vue 的新文件,输入以下内容:

-- -------------------- ---- -------
----------
  ---- ------------------
    ---- ------------
      ---- ------------------
        -------- ---- ---------
        ----
        ----- ---------------------------------
          ---- -------------------
            ------ -------------------------
            ------ ----------- -------------------- ---------- -------------------------
          ------
          ---- -------------------
            ------ ----------------------------------
            ------ --------------- -------------------- -------------- -----------------------------
          ------
          ------- ------------- ---------- ----------------------------
        -------
      ------
    ------
  ------
-----------

--------
------ ----- ---- -------
------ - ---------- - ---- ------

------ ------- -
  ----- -----------
  ---- -- -
    ------ -
      --------- --
    -
  --
  --------- -
    ---------------
      ------
    --
  --
  -------- -
    -------------- -- -
      ------------------------------------------------------ ---------------------- -- -
        ----------- ---- ------- ---------------
      -------------- -- -
        --------------------
        ------------ -------- ---- -------
      --
    -
  --
  ------- -- -
    ------------- - --------------------------------
  -
-
---------

注意,在此组件中,我们使用了一个名为 mapGetters 的函数,它来自 Vuex。它将从 store 中获取所需的值。

配置路由

我们现在需要将我们的组件添加到我们应用的路由中。

打开 frontend/src/router/index.js 文件,输入以下内容:

-- -------------------- ---- -------
------ --- ---- -----
------ ------ ---- ------------
------ -------- ---- -----------------------
------ ------- ---- ----------------------
------ -------- ---- -----------------------

---------------

------ ------- --- --------
  ----- ----------
  ------- -
    -
      ----- ----
      ----- -------
      ---------- --------
    --
    -
      ----- ------------
      ----- ------
      ---------- -------
    --
    -
      ----- -----------------
      ----- -------
      ---------- ---------
      ------ ----
    -
  -
--

这个文件定义了三个路由:

  • “/”路由用于演示待办事项列表。
  • “/add-todo”路由用于演示添加新待办事项的表单。
  • “/edit-todo/:id” 路由用于显示编辑待办事项的表单,并接受一个 ID 参数。

抽象 API 调用

Axios 是一个强大的 JavaScript 库,它可以轻松处理与 Web 服务的交互(如 REST API)。但是,大多数情况下,我们会多次调用相同的 API,并在各种访问页面时调用。在 Vue.js 中,可以通过引入 Axios 实例来解决这个问题。

在 frontend/src/api/index.js 文件中输入以下内容,创建一个名为 API 的文件:

-- -------------------- ---- -------
------ ----- ---- -------

------ --------- -- -
  ------ --------------
    -------- -------------------------
    ---------------- ------
    -------- -
      --------- -------------------
      --------------- ------------------
    -
  --
-

现在你可以将这个文件导入其他文件中,并通过 API 对象调用进行抽象。

添加 Vuex 状态管理

Vuex 是 Vue.js 的官方状态管理库。它允许您在单个全局对象中存储和操作应用程序的所有状态。在我们的应用程序中,我们将使用 Vuex 存储待办事项的状态。

在 src/state/store.js 文件夹中输入以下内容,创建名为 shop.js 的文件:

-- -------------------- ---- -------
------ --- ---- -----
------ ---- ---- ------
------ --- ---- --------

-------------

------ ------- --- ------------
  ------ -
    ---------- --
  --
  ---------- -
    -------------- ------- ------ -
      --------------- - -----
    --
    ------------- ------- ----- -
      --------------------------
    --
    ---------------- ------- ----- -
      ----- ----- - ---------------------------------- -- ----------- --- --------
      ----------------------------- -- -----
    --
    ---------------- ------- ------- -
      ----- ----- - ---------------------------------- -- ----------- --- -------
      ----------------------------- --
    -
  --
  -------- -
    --------------- -- ------ -- -
      --------------------------------------- -- -
        ------------------------ --------------
      --
    --
    ----------- -- ------ -- ----- -
      -------------------------- ------------------- -- -
        ----------------------- --------------
      --
    --
    -------------- -- ------ -- ----- -
      -----------------
      ------------------------------------ ------------------- -- -
        -------------------------- --------------
      --
    --
    -------------- -- ------ -- ------- -
      ---------------------------------------------- -- -
        -------------------------- -------
      --
    -
  --
  -------- -
    ----- ------- -- ---- -- -
      ------ ----------------------------- -- ----------- --- -------------
    -
  -
--

在这个文件中,我们定义了一些 Vuex 状态管理的概念:

  • state 定义了我们的应用程序的状态。在这里,我们只定义了一个 todoItems 数组,它用于存储我们的待办事项。
  • mutations 定义了如何在我们的应用程序中修改状态。我们定义了四个 mutation:SET_TODO_ITEMS,ADD_TODO_ITEM,UPDATE_TODO_ITEM 和 DELETE_TODO_ITEM。
  • actions 定义了提交 mutations 所需的函数。在这里,我们定义了四个动作:getAllTodoItems,addTodoItem,updateTodoItem 和 deleteTodoItem。
  • getters 用于获取和修改存储在 Vuex 根状态上的组件的计算属性。在这里,我们定义了一个名为 item 的 getter,该 getter 接受 id 参数并返回具有该 id 的 todo item。

将 Vuex 状态添加到我们的应用程序中

现在我们已经创建了我们的 Vuex store,我们需要将它导入应用程序并让它生效。打开 src/main.js 文件,输入以下内容:

-- -------------------- ---- -------
------ --- ---- -----
------ --- ---- -----------
------ ------ ---- ----------
------ ----- ---- ---------------
------ ----------------------------------
------ --------------------------------------
------ ---------------------

------------------------ - -----

--- -----
  -------
  ------
  ------- - -- ------
-----------------

在这个文件中,我们使用 import 语句引入我们从 Vuex 创建的 store 对象。

更新 TodoList 组件

现在我们已经将待办事项的状态管理委托给 Vuex,我们需要更新 TodoList 组件以依赖于 Vuex store。

在 frontend/src/components/TodoList.vue 文件中,输入以下代码:

-- -------------------- ---- -------
----------
  ---- ------------------------
    ---- ------------
      ---- -----------------
        -------- ---------
      ------
      ---- -----------------
        ------------ -------------- ---------- ----------- ------ ---------------- ------------------
      ------
    ------
    ----
    ---- ------------------
      ---- ----------------- ------ -- ---------- -------------
        ---- ------------
          ---- -----------------
            ----- --------- ------------ ------------------ ----- -------------- ---------
          ------
          ---- --------------- ------------
            ------------ ------ ----- ------- ------- ---- ------------ -- ---------- ----------- --------------------------
            ------- ---------- ---------- ------- -------------------------------------------------
          ------
        ------
        ----
      ------
    ------
    ---- -------
      ----------
    ------
  ------
-----------

--------
------ - -------- - ---- ------
------ - ---------- - ---- ------
------ ----- ---- -------

------ ------- -
  ----- -----------
  --------- -
    -------------
      -----------
    --
  --
  ---- -- -
    ------ -
      ---------- ----
    -
  --
  -------- -
    ---------------
      ------------
    ---
    ------------- -------- -- -
      -----
        -----------------------------------------
        -------------- -- -
          -------------- - -------------
        --
        ----------- -- -
          -------------- - -----
        --
    --
    --------------- -------- ---------- -
      -- ------------- --- ---- --- ---- -- ------ ----------------------- -
        ----------------------------
      -
    -
  --
  ------- -- -
    -------------------
  -
-
---------

-------
---------- -
  ---------------- -------------
-
--------

在这里,我们使用了名称为 todoItems 的计算属性代替普通的数组。

运行应用

为了运行应用程序,请打开一个命令提示符,导航到 vue-django 目录,并运行以下命令:

在您的浏览器中,转到 http://localhost:8000/ 来访问我们的 Django API。现在我们需要启动 Vue.js。

在另一个命令提示符窗口中,导航到 frontend 文件夹并运行以下命令:

Now,我们已经为 Vue.js 和 Django 构建了一个完整的 Web 应用程序。恭喜你!

结论

Vue.js 和 Django 是两个广泛使用的框架,用于构建 Web 应用程序。在本文中,我们介绍了如何使用这两个框架构建一个完整的 Web 应用程序。我们从 Django 的创建和配置开始,然后转向 Vue.js 的构建。我们构建了三个组件,分别用于列出待办事项,添加待办事项和编辑待办事项。我们还使用 Axios 库发送 HTTP 请求,使用 Vuex 管理我们的应用程序状态。最后,在运行我们的应用程序之前,我们还告诉您如何在 Windows 和 Linux 上设置并运行开发环境。通过本教程,您已经学会了构建 Web 应用程序的基本知识,现在,趁着这股热潮,快快动手尝试吧!

来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/674974d3a1ce006354604023

纠错
反馈