Django+Vue3全棧開發實戰:從零搭建博客系統

在這里插入圖片描述

文章目錄

    • 1. 開發環境準備
    • 2. 創建Django項目與配置
    • 3. 設計數據模型與API
    • 4. 使用DRF創建RESTful API
    • 5. 創建Vue3項目與配置
    • 6. 前端頁面開發與組件設計
    • 7. 前后端交互與Axios集成
    • 8. 項目優化與調試
    • 9. 部署上線
    • 10. 總結與擴展
      • 10.1 項目總結
        • 10.1.1 技術棧回顧
        • 10.1.2 項目亮點
      • 10.2 擴展方向
        • 10.2.1 功能擴展
        • 10.2.2 技術擴展
      • 10.3 最佳實踐
        • 10.3.1 后端最佳實踐
        • 10.3.2 前端最佳實踐
      • 10.4 常見問題與解決方案
        • 10.4.1 后端常見問題
        • 10.4.2 前端常見問題
      • 10.5 參考資料與擴展閱讀

1. 開發環境準備

# 檢查Python版本
python --version  # 要求3.8+# 安裝虛擬環境工具
pip install virtualenv# 檢查Node.js版本
node -v  # 要求16+

2. 創建Django項目與配置

# 創建項目目錄
mkdir blog_project && cd blog_project# 創建虛擬環境
virtualenv venv
source venv/bin/activate  # Linux/Mac
venv\Scripts\activate    # Windows# 安裝Django
pip install django# 創建項目
django-admin startproject backend
cd backend# 創建應用
python manage.py startapp blog

配置settings.py:

INSTALLED_APPS = [...'rest_framework','corsheaders','blog.apps.BlogConfig'
]MIDDLEWARE = [...'corsheaders.middleware.CorsMiddleware',
]CORS_ALLOW_ALL_ORIGINS = True

3. 設計數據模型與API

models.py:

from django.db import models
from django.contrib.auth.models import Userclass Post(models.Model):title = models.CharField(max_length=200)content = models.TextField()author = models.ForeignKey(User, on_delete=models.CASCADE)created_at = models.DateTimeField(auto_now_add=True)updated_at = models.DateTimeField(auto_now=True)def __str__(self):return self.title

執行遷移:

python manage.py makemigrations
python manage.py migrate

4. 使用DRF創建RESTful API

serializers.py:

from rest_framework import serializers
from .models import Postclass PostSerializer(serializers.ModelSerializer):author = serializers.ReadOnlyField(source='author.username')class Meta:model = Postfields = '__all__'

views.py:

from rest_framework import viewsets
from .models import Post
from .serializers import PostSerializerclass PostViewSet(viewsets.ModelViewSet):queryset = Post.objects.all()serializer_class = PostSerializerdef perform_create(self, serializer):serializer.save(author=self.request.user)

urls.py:

from django.urls import path, include
from rest_framework.routers import DefaultRouter
from blog import viewsrouter = DefaultRouter()
router.register(r'posts', views.PostViewSet)urlpatterns = [path('api/', include(router.urls)),
]

5. 創建Vue3項目與配置

npm init vue@latest frontend
cd frontend
npm install
npm run dev

安裝必要依賴:

npm install axios vue-router@4 pinia

配置main.js:

import { createApp } from 'vue'
import { createPinia } from 'pinia'
import App from './App.vue'
import router from './router'const app = createApp(App)
app.use(createPinia())
app.use(router)
app.mount('#app')

6. 前端頁面開發與組件設計

PostList.vue組件示例:

<template><div class="post-list"><div v-for="post in posts" :key="post.id" class="post-card"><h3>{{ post.title }}</h3><p>{{ post.content.substring(0, 100) }}...</p><div class="meta"><span>作者:{{ post.author }}</span><span>發布時間:{{ formatDate(post.created_at) }}</span></div></div></div>
</template><script setup>
import { ref, onMounted } from 'vue'
import axios from 'axios'const posts = ref([])const fetchPosts = async () => {try {const response = await axios.get('http://localhost:8000/api/posts/')posts.value = response.data} catch (error) {console.error('獲取文章失敗:', error)}
}const formatDate = (dateString) => {return new Date(dateString).toLocaleDateString()
}onMounted(() => {fetchPosts()
})
</script><style scoped>
.post-list {max-width: 800px;margin: 0 auto;
}
.post-card {background: #fff;border-radius: 8px;padding: 20px;margin-bottom: 20px;box-shadow: 0 2px 4px rgba(0,0,0,0.1);
}
</style>

7. 前后端交互與Axios集成

創建axios實例:

// src/utils/http.js
import axios from 'axios'const instance = axios.create({baseURL: 'http://localhost:8000/api',timeout: 5000,headers: {'Content-Type': 'application/json'}
})export default instance

使用Pinia狀態管理:

// stores/postStore.js
import { defineStore } from 'pinia'
import http from '@/utils/http'export const usePostStore = defineStore('post', {actions: {async createPost(postData) {try {const response = await http.post('/posts/', postData)return response.data} catch (error) {throw error.response.data}}}
})

8. 項目優化與調試

配置Django靜態文件:

# settings.py
STATIC_URL = '/static/'
STATIC_ROOT = BASE_DIR / 'staticfiles'

Vue生產構建:

npm run build

配置WhiteNoise中間件:

MIDDLEWARE = ['whitenoise.middleware.WhiteNoiseMiddleware',...
]STATICFILES_STORAGE = 'whitenoise.storage.CompressedManifestStaticFilesStorage'

9. 部署上線

使用Gunicorn部署Django:

pip install gunicorn
gunicorn backend.wsgi:application --bind 0.0.0.0:8000

配置Nginx:

server {listen 80;server_name example.com;location /api {proxy_pass http://localhost:8000;proxy_set_header Host $host;}location / {root /path/to/vue/dist;try_files $uri $uri/ /index.html;}
}

10. 總結與擴展

10.1 項目總結

在本項目中,我們通過Django和Vue3實現了一個全棧博客系統,涵蓋了從前端到后端的完整開發流程。以下是項目的主要技術點總結:

10.1.1 技術棧回顧
  1. 后端技術棧

    • Django:作為核心框架,提供了強大的ORM、路由管理、模板引擎等功能。
    • Django REST Framework (DRF):用于快速構建RESTful API,支持序列化、視圖集、權限控制等功能。
    • 數據庫:使用SQLite作為開發數據庫,支持無縫遷移到MySQL或PostgreSQL。
    • 身份驗證:通過Django內置的User模型和DRF的TokenAuthentication實現用戶認證。
    • CORS:通過django-cors-headers解決跨域問題,確保前后端分離架構的正常運行。
  2. 前端技術棧

    • Vue3:作為前端框架,提供了組合式API、響應式數據綁定、組件化開發等特性。
    • Pinia:用于狀態管理,替代Vuex,提供更簡潔的API和TypeScript支持。
    • Axios:用于發送HTTP請求,與后端API進行數據交互。
    • Vue Router:實現前端路由管理,支持動態路由、嵌套路由等功能。
    • Element Plus:作為UI組件庫,提供豐富的組件和樣式,加速頁面開發。
  3. 開發工具

    • VS Code:作為主要開發工具,配合插件(如Vetur、ESLint、Prettier)提升開發效率。
    • Postman:用于API調試和測試。
    • Git:用于版本控制,支持團隊協作開發。
  4. 部署方案

    • Nginx:作為反向代理服務器,處理靜態文件請求和負載均衡。
    • Gunicorn:作為WSGI服務器,用于部署Django應用。
    • Docker:通過容器化技術簡化部署流程,支持跨平臺運行。
10.1.2 項目亮點
  1. 前后端分離架構

    • 前端和后端完全解耦,通過API進行數據交互,提高了開發效率和可維護性。
    • 前端可以獨立部署,支持多平臺(如Web、移動端)共享同一套API。
  2. 模塊化設計

    • 后端通過Django的App機制將功能模塊化,便于擴展和維護。
    • 前端通過Vue3的組件化開發,實現了高內聚、低耦合的代碼結構。
  3. 響應式設計

    • 前端頁面采用響應式布局,適配不同設備(PC、平板、手機)。
    • 使用Element Plus的柵格系統和組件,快速構建美觀的UI。
  4. 性能優化

    • 后端通過DRF的分頁、緩存、查詢優化等技術提升API性能。
    • 前端通過懶加載、代碼分割、圖片壓縮等技術減少頁面加載時間。
  5. 安全性

    • 后端通過Django的CSRF保護、XSS防護、SQL注入防護等機制確保數據安全。
    • 前端通過Axios的請求攔截器和響應攔截器處理錯誤和權限驗證。

10.2 擴展方向

10.2.1 功能擴展
  1. 用戶認證與權限管理

    • 實現基于JWT(JSON Web Token)的身份驗證,支持無狀態認證。
    • 添加角色管理功能(如管理員、普通用戶),實現細粒度的權限控制。
  2. 文件上傳與存儲

    • 支持用戶上傳頭像、文章封面等文件。
    • 使用云存儲服務(如AWS S3、阿里云OSS)存儲靜態文件。
  3. 評論與點贊功能

    • 實現文章評論功能,支持嵌套評論和分頁加載。
    • 添加點贊功能,記錄用戶的點贊行為。
  4. 搜索與過濾

    • 實現全文搜索功能,使用Elasticsearch或Django的django-filter庫。
    • 支持按標簽、分類、時間等條件過濾文章。
  5. 實時通知

    • 使用WebSocket實現實時通知功能(如新評論、點贊提醒)。
    • 集成第三方通知服務(如Firebase Cloud Messaging)。
  6. 國際化與多語言支持

    • 使用Django的django-i18n實現后端多語言支持。
    • 使用Vue3的vue-i18n實現前端多語言切換。
10.2.2 技術擴展
  1. TypeScript支持

    • 將Vue3項目遷移到TypeScript,提升代碼的可維護性和類型安全性。
    • 配置ESLint和Prettier,統一代碼風格。
  2. GraphQL集成

    • 使用GraphQL替代RESTful API,提供更靈活的數據查詢能力。
    • 集成Apollo Client作為前端GraphQL客戶端。
  3. 微服務架構

    • 將單體應用拆分為多個微服務(如用戶服務、文章服務、評論服務)。
    • 使用Docker和Kubernetes實現容器化部署和動態擴縮容。
  4. Serverless架構

    • 將部分功能(如圖片處理、郵件發送)遷移到Serverless平臺(如AWS Lambda)。
    • 使用Vercel或Netlify部署前端應用。
  5. 自動化測試

    • 使用Pytest和Django的測試工具編寫后端單元測試和集成測試。
    • 使用Jest和Vue Test Utils編寫前端單元測試和組件測試。
  6. CI/CD集成

    • 使用GitHub Actions或GitLab CI實現持續集成和持續部署。
    • 配置自動化測試、代碼檢查和部署流程。

10.3 最佳實踐

10.3.1 后端最佳實踐
  1. 代碼結構優化

    • 使用Django的App機制將功能模塊化,避免單個App過于臃腫。
    • 將業務邏輯放在Service層,減少視圖函數的復雜度。
  2. API設計規范

    • 遵循RESTful API設計原則,使用合適的HTTP方法和狀態碼。
    • 使用版本控制(如/api/v1/posts)確保API的兼容性。
  3. 數據庫優化

    • 使用索引加速查詢,避免全表掃描。
    • 使用select_relatedprefetch_related優化關聯查詢。
  4. 緩存機制

    • 使用Redis緩存頻繁訪問的數據(如文章列表、用戶信息)。
    • 使用Django的緩存框架實現頁面級緩存和片段緩存。
  5. 日志記錄

    • 使用Python的logging模塊記錄關鍵操作和錯誤信息。
    • 配置日志輪轉和分級存儲,便于問題排查。
10.3.2 前端最佳實踐
  1. 組件化開發

    • 將頁面拆分為多個可復用的組件,提高代碼的可維護性。
    • 使用插槽(Slot)和Props實現組件的靈活配置。
  2. 狀態管理

    • 使用Pinia集中管理全局狀態,避免組件間直接傳遞數據。
    • 將異步操作(如API請求)放在Store中,減少組件的復雜度。
  3. 性能優化

    • 使用懶加載和代碼分割減少首屏加載時間。
    • 使用v-ifv-show優化DOM渲染性能。
  4. 錯誤處理

    • 使用Axios的攔截器統一處理請求錯誤和響應錯誤。
    • 在組件中顯示友好的錯誤提示,提升用戶體驗。
  5. SEO優化

    • 使用Vue Router的meta標簽設置頁面標題和描述。
    • 使用SSR(服務器端渲染)或預渲染技術提升SEO效果。

10.4 常見問題與解決方案

10.4.1 后端常見問題
  1. 跨域問題

    • 解決方案:使用django-cors-headers中間件,配置CORS_ALLOW_ALL_ORIGINS或白名單。
  2. 數據庫遷移失敗

    • 解決方案:檢查模型定義是否正確,刪除遷移文件并重新生成。
  3. 性能瓶頸

    • 解決方案:使用Django Debug Toolbar分析性能問題,優化查詢和緩存。
  4. 安全性問題

    • 解決方案:啟用Django的安全中間件,定期更新依賴庫。
10.4.2 前端常見問題
  1. 頁面加載慢

    • 解決方案:使用懶加載、代碼分割、CDN加速等技術優化加載速度。
  2. 組件通信復雜

    • 解決方案:使用Pinia集中管理狀態,減少組件間的直接通信。
  3. API請求失敗

    • 解決方案:檢查網絡連接、API地址和請求參數,使用攔截器統一處理錯誤。
  4. 瀏覽器兼容性問題

    • 解決方案:使用Babel和PostCSS處理兼容性問題,測試主流瀏覽器。

10.5 參考資料與擴展閱讀

  1. 官方文檔

    • Django官方文檔
    • Vue3官方文檔
    • DRF官方文檔
  2. 推薦書籍

    • 《Django for Beginners》
    • 《Vue.js設計與實現》
    • 《RESTful API設計指南》
  3. 在線課程

    • Django全棧開發實戰
    • Vue3高級開發技巧
  4. 開源項目

    • Django博客系統
    • Vue3管理后臺

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/70453.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/70453.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/70453.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Django 5實用指南(五)模板系統

Django5的模板系統是其核心功能之一&#xff0c;允許開發者將動態數據嵌入到HTML模板中&#xff0c;并根據不同的業務需求渲染頁面。Django模板系統基于 Django模板語言&#xff08;DTL&#xff09;&#xff0c;它提供了一些強大的功能&#xff0c;如模板標簽、過濾器、條件語句…

uni-app開發app時 使用uni.chooseLocation遇到的問題

問題一&#xff1a;不顯示 問題二&#xff1a;選擇地址列表一直在加載中 因為 uni-app 接口文檔 中已經說明&#xff0c;使用騰訊的話需要開啟云服務&#xff0c;具體可看官網&#xff0c;這就是為什么使用時直接不顯示的原因&#xff0c;所以我使用的高德&#xff0c;但又出現…

推薦系統-排序模型

本次學習的重點是FM系列和WideNDeep系列。其實這兩個模型是存在因果關系的。從最初的LR模型開始&#xff0c;因為缺失高效的特征交互方式&#xff0c;產生了FM模型&#xff0c;即通過向量內積代替特征之間的兩兩交互的參數。最后DNN的引入可以建模更高階的特征。但是DNN如何與F…

體驗用ai做了個python小游戲

體驗用ai做了個python小游戲 寫在前面使用的工具2.增加功能1.要求增加視頻作為背景。2.我讓增加了一個歡迎頁面。3.我發現中文顯示有問題。4.我提出了背景修改意見&#xff0c;歡迎頁面和結束頁面背景是視頻&#xff0c;游戲頁面背景是靜態圖片。5.提出增加更多游戲元素。 總結…

c#爬取數據并解析json

安裝 Newtonsoft.Json Install-Package Newtonsoft.Json代碼 HttpClient client new HttpClient();// 獲取網頁內容HttpResponseMessage response client.GetAsync("https://opentdb.com/api.php?amount10&category18&difficultyeasy&typemultiple"…

計算機畢業設計Python農產品推薦系統 農產品爬蟲 農產品可視化 農產品大數據(源碼+LW文檔+PPT+講解)

溫馨提示&#xff1a;文末有 CSDN 平臺官方提供的學長聯系方式的名片&#xff01; 溫馨提示&#xff1a;文末有 CSDN 平臺官方提供的學長聯系方式的名片&#xff01; 溫馨提示&#xff1a;文末有 CSDN 平臺官方提供的學長聯系方式的名片&#xff01; 作者簡介&#xff1a;Java領…

【分布式理論13】分布式存儲:數據存儲難題與解決之道

文章目錄 一、數據存儲面臨的問題二、RAID磁盤陣列的解決方案1. RAID概述2. RAID使用的技術3. RAID的代表性等級 三、分布式存儲的新思路1. 分布式存儲背景與特點2. 分布式存儲的組成要素 一、數據存儲面臨的問題 在單機系統時代&#xff0c;當數據量不斷增加、硬盤空間不夠時…

高德地圖android sdk(備忘)

依賴 // 權限請求框架&#xff1a;https://github.com/getActivity/XXPermissions implementation com.github.getActivity:XXPermissions:20.0 // https://mvnrepository.com/artifact/com.amap.api/navi-3dmap-location-search implementation com.amap.api:navi-3dmap-loca…

DeepSeek、微信、硅基流動、納米搜索、秘塔搜索……十種不同方法實現DeepSeek使用自由

為了讓大家實現 DeepSeek 使用自由&#xff0c;今天分享 10 個暢用 DeepSeek 的平臺。 一、官方滿血版&#xff1a;DeepSeek官網與APP 首推&#xff0c;肯定是 DeepSeek 的官網和 APP&#xff0c;可以使用滿血版 R1 和 V3 模型&#xff0c;以及聯網功能。 網址&#xff1a; htt…

自動化之ansible(二)

一、ansible中playbook&#xff08;劇本&#xff09; 官方文檔&#xff1a; Ansible playbooks — Ansible Community Documentation 1、playbook的基本結構 一個基本的playbook由以下幾個主要部分組成 hosts: 定義要執行任務的主機組或主機。 become: 是否需要使用超級用戶…

python 神經網絡教程,神經網絡模型代碼python,小白入門基礎教程

文章目錄 前言1. 神經網絡基礎概念1.1 神經元1.2 激活函數1.3 神經網絡結構1.4 安裝 Python1.5 選擇開發環境2. 使用numpy構建簡單神經網絡 3. 使用PyTorch構建復雜神經網絡 前言 本教程旨在為廣大初學者和有一定基礎的開發者提供一個系統、全面且深入的 Python 神經網絡學習指…

SOME/IP--協議英文原文講解10

前言 SOME/IP協議越來越多的用于汽車電子行業中&#xff0c;關于協議詳細完全的中文資料卻沒有&#xff0c;所以我將結合工作經驗并對照英文原版協議做一系列的文章。基本分三大塊&#xff1a; 1. SOME/IP協議講解 2. SOME/IP-SD協議講解 3. python/C舉例調試講解 4.2.2 Req…

Spring框架基本使用(Maven詳解)

前言&#xff1a; 當我們創建項目的時候&#xff0c;第一步少不了搭建環境的相關準備工作。 那么如果想讓我們的項目做起來方便快捷&#xff0c;應該引入更多的管理工具&#xff0c;幫我們管理。 Maven的出現幫我們大大解決了管理的難題&#xff01;&#xff01; Maven&#xf…

用大內存主機下載Visual Studio

用一臺內存達到128G的主機下載Visual Studio 2022&#xff0c;用的是公司網絡。下載速度讓我吃了一驚&#xff0c;沒人用網絡了&#xff1f;還是網站提速了&#xff1f;以前最大只能達到5MB/秒。記錄這段經歷&#xff0c;是用來分析公司網絡用的......

Ubuntu20.04.2安裝Vmware tools

軟件版本&#xff1a;Vmware Workstation Pro 17.6.2 操作系統鏡像文件&#xff1a;ubuntu-20.04.2-desktop-amd64 方式1&#xff1a;用iso鏡像安裝 沒用這種方法&#xff0c;太麻煩 方式2&#xff1a;用apt安裝Open VM Tools 如果你使用的是較新的Ubuntu版本&#xff08;如…

Mac系統下使用Docker快速部署MaxKB:打造本地知識庫問答系統

隨著大語言模型的廣泛應用&#xff0c;知識庫問答系統逐漸成為提升工作效率和個人學習的有力工具。MaxKB是一款基于LLM&#xff08;Large Language Model&#xff09;大語言模型的知識庫問答系統&#xff0c;支持多模型對接、文檔上傳和自動爬取等功能。本文將詳細介紹如何在Ma…

2526考研資料分享 百度網盤

通過網盤分享的文件&#xff1a;01、2026【考研數學】 鏈接: https://pan.baidu.com/s/1N-TlXcCKMcX1U-KBr0Oejg?pwducbe 提取碼: ucbe 提取碼:98wg--來自百度網盤超級會員v3的分享 通過網盤分享的文件&#xff1a;01、2026【考研政治】 鏈接: https://pan.baidu.com/s/1N-T…

【信息系統項目管理師-案例真題】2013下半年案例分析答案和詳解

更多內容請見: 備考信息系統項目管理師-專欄介紹和目錄 文章目錄 試題一【問題? 1】(12 分)【問題? 2】(10 分)【問題 3】( 3 分 )試題二【問題? 1】(3? 分)【問題? 2】(10? 分)【問題? 3】(3? 分)【問題? 4】(9? 分)試題三【問題? 1】(12? 分)?【問題? 2】(8?…

idea連接gitee(使用idea遠程兼容gitee)

文章目錄 先登錄你的gitee拿到你的郵箱找到idea的設置選擇密碼方式登錄填寫你的郵箱和密碼登錄成功 先登錄你的gitee拿到你的郵箱 具體位置在gitee–>設置–>郵箱管理 找到idea的設置 選擇密碼方式登錄 填寫你的郵箱和密碼 登錄成功

UNIAPP開發之利用阿里RTC服務實現音視頻通話后端THINKPHP5

下面是一個使用ThinkPHP 5實現后端邏輯的示例。我們將創建一個簡單的ThinkPHP 5項目來處理生成推流和播流地址的請求。 后端部分&#xff08;ThinkPHP 5&#xff09; 1. 初始化ThinkPHP 5項目 首先&#xff0c;確保你已經安裝了Composer。然后使用Composer創建一個新的Think…