Django 與 Vue 的專案目錄與設計流程指南
更新日期: 2025 年 1 月 1 日
本文為 Django + Vue 前後端分離解析,第 18 篇:
- 前後端分離的 404 錯誤處理:步驟指南
- 正常網頁與 API 接口:新手指南
- GraphQL 與 REST:理解新時代的 API 設計
- 為什麼自定義 404 頁面需要同時支持 API 和 HTML:新手指南
- 前後端分離中的路由與錯誤處理:新手指南
- 設計後端 API 的 404 錯誤處理:新手指南
- 前端與後端的 HTTP 請求與響應協議
- Django 中自定義 404 專案架構的最佳實踐
- 深入理解 Django 中的自定義 404 views 函數處理解析
- Django 的 handler404:自定義 404 錯誤頁面的核心
- Django 的 render 函數與 status 參數:為什麼重要?
- 使用 Accept 判斷請求格式:如何實現靈活的錯誤處理?
- 使用 Esbuild 搭建 Vue 開發環境的指南
- 新手入門:TailwindCSS 與 DaisyUI 的整合指南
- Django 靜態文件管理:static 與 staticfiles 完整指南
- 使用 WhiteNoise 簡化 Django 靜態文件管理:新手入門指南
- Vue 與 Django 整合:從編輯到部署的完整指南
- Django 與 Vue 的專案目錄與設計流程指南 👈 所在位置
- Django + Vue 前後端分離架構:後端路由渲染解析
- Vue 3 應用的主入口詳解:如何初始化應用
- 探索 Vue 應用的根組件:App.vue 的角色與設計
- Vue.js 單頁應用(SPA)邏輯與運作流程詳解
- 新手指南:使用 Axios 實現高效的 HTTP 請求
- 在 Vue 中處理 404 錯誤組件(component)設計:新手指南
- Vue Router 新手指南:設置 404 錯誤頁面
將 Django 和 Vue 結合是一種強大的全端開發模式,可以實現後端與前端的功能分離。
本指南將引導新手了解如何組織目錄結構,以及 Django 和 Vue 的路由、視圖、組件如何協同工作,從而構建一個完整的 Web 應用。
專案目錄結構總覽
以下是 Django 與 Vue 整合專案的典型目錄結構:
18TH-TRICO/
├── core/
│ ├── urls.py # Django 路由設定
│ ├── views.py # Django 視圖處理
│ ├── settings.py # Django 設定
├── frontend/
│ ├── scripts/
│ │ ├── app.js # Vue 應用入口
│ │ ├── App.vue # Vue 主組件
│ │ ├── router.js # Vue 路由
│ │ └── components/
│ │ └── NotFoundPage.vue # Vue 組件
├── static/
│ ├── scripts/ # 編譯後的前端 JavaScript
│ ├── styles/ # 編譯後的 CSS 文件
├── templates/
│ └── shared/
│ └── vue404_page.html # 用於嵌入 Vue 的 Django 模板
目錄重點解讀
core/
:Django 的核心功能目錄,包括路由、視圖邏輯及全域設定。frontend/
:存放 Vue 原始文件,包括應用入口、組件、路由配置。static/
:保存打包後的前端資源(JavaScript 和 CSS)。templates/
:保存 Django 的模板文件,其中vue404_page.html
用於嵌入 Vue。
設計流程解析
在此專案中,前端由 Vue 處理頁面導航,後端由 Django 提供 API 和渲染入口模板。以下為設計流程圖:
+------------------+ +---------------------+
| Django Router | <---------------+ Client HTTP Request |
| (core/urls.py) | +---------------------+
+--------+---------+
|
| Route 1: API or Django View
|------------------------> Django views.py handles logic
|
| Route 2: Frontend Route
+------------------+
|
v
+-------------------------+
| Vue Entrypoint (app.js) |
| Loads vue404_page.html |
+-----------+-------------+
|
v
+---------------------------+
| Vue Router (router.js) |
| Matches Frontend Pages |
+-----------+---------------+
|
v
+-----------------------+
| Vue Components |
| (e.g., NotFoundPage) |
+-----------------------+
流程分步講解
Django 路由分配
Django 的 urls.py
是 HTTP 請求的入口:
- 如果請求匹配後端的 API 或視圖路徑,則由 Django 處理並返回相應數據。
- 如果請求為前端路由(未匹配到後端 API),則將請求轉發給
vue404_page
視圖處理。
範例(core/urls.py
):
from django.urls import path
from . import views
urlpatterns = [
path('api/example/', views.example_api), # 後端 API
path('', views.vue404_page), # 前端路由
]
Django 視圖渲染
當路由匹配到 vue404_page
時,Django 返回包含 Vue 應用容器的 HTML 模板。
範例(core/views.py
):
from django.shortcuts import render
def vue404_page(request):
return render(request, 'shared/vue404_page.html')
範例模板(vue404_page.html
):
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>My Vue App</title>
<script src="/static/scripts/frontend_app.js" defer></script>
</head>
<body>
<div id="app"></div> <!-- Vue 將掛載到這裡 -->
</body>
</html>
Vue 應用啟動
當前端加載 frontend_app.js
,Vue 開始啟動應用並接管 DOM。
範例(frontend/scripts/app.js
):
import { createApp } from 'vue';
import App from './App.vue'; // 主組件
import router from './router.js'; // 路由
const app = createApp(App);
app.use(router);
app.mount('#app'); // 掛載到 `#app` 容器
Vue Router 處理導航
Vue Router 負責匹配前端路由並顯示對應的組件。
範例(frontend/scripts/router.js
):
import { createRouter, createWebHistory } from 'vue-router';
import Home from './components/Home.vue';
import About from './components/About.vue';
import NotFoundPage from './components/NotFoundPage.vue';
const routes = [
{ path: '/', component: Home },
{ path: '/about', component: About },
{ path: '/:pathMatch(.*)*', component: NotFoundPage }, // 處理未匹配路徑
];
const router = createRouter({
history: createWebHistory(),
routes,
});
export default router;
Vue 組件渲染
根據路由匹配結果,Vue 渲染對應的組件。例如,未找到路徑時顯示 NotFoundPage.vue
。
範例(NotFoundPage.vue
):
<template>
<div>
<h1>404 - Page Not Found</h1>
<p>The page you are looking for does not exist.</p>
</div>
</template>
<script>
export default {
name: 'NotFoundPage',
};
</script>
Django 與 Vue 分工概述
Django 負責任務 | Vue 負責任務 |
---|---|
處理後端 API 請求 | 處理前端頁面導航 |
渲染模板(提供 Vue 容器) | 顯示對應路由的 Vue 組件 |
提供靜態文件服務 | 管理和渲染前端的組件及邏輯 |
結語
這種 Django 與 Vue 的整合方式讓我們在後端和前端的分工更為清晰。
Django 專注於後端業務邏輯和 API,而 Vue 負責頁面顯示和互動。希望本文能幫助您更好地理解這種設計模式,並順利構建自己的全端應用!🎉