详细介绍:Django与前端框架集成:Vue.js、React的完美配合

news/2026/1/21 17:14:49/文章来源:https://www.cnblogs.com/gccbuaa/p/19513052

目录

  • Django与前端框架集成:Vue.js、React的完美配合
    • 引言
    • 1. 架构模式选择
      • 1.1 分离式部署
      • 1.2 一体化部署
    • 2. Django与Vue.js集成
      • 2.1 基础配置
      • 2.2 深度集成方案
      • 2.3 高级功能集成
    • 3. Django与React集成
      • 3.1 项目配置
      • 3.2 React组件集成
      • 3.3 状态管理集成
    • 4. 高级集成特性
      • 4.1 认证与授权
      • 4.2 文件上传与处理
    • 5. 部署与优化
      • 5.1 生产环境配置
      • 5.2 性能优化
    • 6. 最佳实践总结

『宝藏代码胶囊开张啦!』—— 我的 CodeCapsule 来咯!✨写代码不再头疼!我的新站点 CodeCapsule 主打一个 “白菜价”+“量身定制”!无论是卡脖子的毕设/课设/文献复现,需要灵光一现的算法改进,还是想给项目加个“外挂”,这里都有便宜又好用的代码方案等你发现!低成本,高适配,助你轻松通关!速来围观 CodeCapsule官网

Django与前端框架集成:Vue.js、React的完美配合

引言

在现代Web开发中,前后端分离已成为主流架构模式。Django作为强大的后端框架,与Vue.js、React等现代前端框架的集成能够打造出功能丰富、用户体验优异的Web应用。本文将深入探讨Django如何与这些前端框架完美配合。

1. 架构模式选择

1.1 分离式部署

# Django作为纯API后端
# settings.py
INSTALLED_APPS = [
'rest_framework',
'corsheaders',
# ...
]
REST_FRAMEWORK = {
'DEFAULT_RENDERER_CLASSES': [
'rest_framework.renderers.JSONRenderer',
]
}
CORS_ALLOWED_ORIGINS = [
"http://localhost:3000",  # React开发服务器
"http://localhost:8080",  # Vue开发服务器
]

1.2 一体化部署

# Django同时服务前端静态文件
# settings.py
INSTALLED_APPS = [
'django.contrib.staticfiles',
]
STATICFILES_DIRS = [
BASE_DIR / "frontend/dist",  # 构建后的前端文件
]

2. Django与Vue.js集成

2.1 基础配置

前端目录结构:

project/
├── backend/          # Django项目
├── frontend/         # Vue.js项目
│   ├── src/
│   ├── public/
│   └── package.json
└── package.json

Django视图配置:

# views.py
from django.views.generic import TemplateView
from django.http import JsonResponse
from rest_framework.views import APIView
from rest_framework.response import Response
class VueAppView(TemplateView):
template_name = 'vue_index.html'
class UserAPI(APIView):
def get(self, request):
users = [
{'id': 1, 'name': '张三', 'email': 'zhangsan@example.com'},
{'id': 2, 'name': '李四', 'email': 'lisi@example.com'}
]
return Response(users)

2.2 深度集成方案

Django模板集成Vue组件:

<!-- templates/vue_index.html -->{% load static %}<!DOCTYPE html><html><head><title>Django + Vue.js</title><link rel="stylesheet" href="{% static 'css/app.css' %}"></head><body><div id="app"><navbar :user="userData"></navbar><router-view></router-view></div><script>window.djangoData = {user: {{ user_data|safe }},csrfToken: "{{ csrf_token }}"};</script><script src="{% static 'js/chunk-vendors.js' %}"></script><script src="{% static 'js/app.js' %}"></script></body></html>

Vue组件调用Django API:

// src/services/api.js
import axios from 'axios';
const apiClient = axios.create({
baseURL: process.env.VUE_APP_API_URL || '/api',
headers: {
'X-CSRFToken': getCSRFToken(),
'Content-Type': 'application/json'
}
});
function getCSRFToken() {
return document.querySelector('[name=csrfmiddlewaretoken]')?.value ||
window.djangoData?.csrfToken;
}
export default {
async getUsers() {
const response = await apiClient.get('/users/');
return response.data;
},
async createUser(userData) {
const response = await apiClient.post('/users/', userData);
return response.data;
}
};

2.3 高级功能集成

实时数据更新:

# consumers.py - Django Channels
import json
from channels.generic.websocket import AsyncWebsocketConsumer
class UserConsumer(AsyncWebsocketConsumer):
async def connect(self):
await self.channel_layer.group_add("users", self.channel_name)
await self.accept()
async def user_updated(self, event):
await self.send(text_data=json.dumps(event["data"]))
// Vue组件中使用WebSocket
// src/components/UserList.vue
<template><div><div v-for="user in users" :key="user.id" class="user-item">{{ user.name }} - {{ user.email }}</div></div></template><script>import { ref, onMounted, onUnmounted } from 'vue';import api from '../services/api';export default {setup() {const users = ref([]);let socket = null;const loadUsers = async () => {users.value = await api.getUsers();};const setupWebSocket = () => {socket = new WebSocket('ws://localhost:8000/ws/users/');socket.onmessage = (event) => {const data = JSON.parse(event.data);// 更新用户列表const index = users.value.findIndex(u => u.id === data.id);if (index !== -1) {users.value.splice(index, 1, data);} else {users.value.push(data);}};};onMounted(() => {loadUsers();setupWebSocket();});onUnmounted(() => {if (socket) socket.close();});return { users };}};</script>

3. Django与React集成

3.1 项目配置

Django REST Framework序列化器:

# serializers.py
from rest_framework import serializers
from django.contrib.auth.models import User
class UserSerializer(serializers.ModelSerializer):
class Meta:
model = User
fields = ['id', 'username', 'email', 'first_name', 'last_name']
read_only_fields = ['id']
class UserProfileSerializer(serializers.Serializer):
user = UserSerializer()
avatar = serializers.ImageField()
bio = serializers.CharField()

React API服务:

// src/services/djangoAPI.js
import axios from 'axios';
class DjangoAPI {
constructor() {
this.client = axios.create({
baseURL: process.env.REACT_APP_API_BASE_URL || 'http://localhost:8000/api',
timeout: 10000,
});
this.setupInterceptors();
}
setupInterceptors() {
this.client.interceptors.request.use(
(config) => {
const token = this.getCSRFToken();
if (token) {
config.headers['X-CSRFToken'] = token;
}
return config;
},
(error) => Promise.reject(error)
);
this.client.interceptors.response.use(
(response) => response,
(error) => {
if (error.response?.status === 403) {
// CSRF token失效,重新获取
this.refreshCSRFToken();
}
return Promise.reject(error);
}
);
}
getCSRFToken() {
// 从cookie或meta标签获取CSRF token
const name = 'csrftoken';
const value = `; ${document.cookie}`;
const parts = value.split(`; ${name}=`);
if (parts.length === 2) return parts.pop().split(';').shift();
return document.querySelector('[name=csrfmiddlewaretoken]')?.value;
}
async refreshCSRFToken() {
await this.client.get('/auth/csrf/');
}
// 用户相关API
async getUsers(params = {}) {
const response = await this.client.get('/users/', { params });
return response.data;
}
async createUser(userData) {
const response = await this.client.post('/users/', userData);
return response.data;
}
async uploadFile(file, onProgress = null) {
const formData = new FormData();
formData.append('file', file);
const config = onProgress ? {
onUploadProgress: (progressEvent) => {
const percent = Math.round(
(progressEvent.loaded * 100) / progressEvent.total
);
onProgress(percent);
}
} : {};
const response = await this.client.post('/upload/', formData, config);
return response.data;
}
}
export default new DjangoAPI();

3.2 React组件集成

用户管理组件:

// src/components/UserManager.jsx
import React, { useState, useEffect } from 'react';
import { Table, Button, Modal, Form, Input, message } from 'antd';
import djangoAPI from '../services/djangoAPI';
const UserManager = () => {const [users, setUsers] = useState([]);const [loading, setLoading] = useState(false);const [modalVisible, setModalVisible] = useState(false);const [form] = Form.useForm();const loadUsers = async () => {setLoading(true);try {const userData = await djangoAPI.getUsers();setUsers(userData);} catch (error) {message.error('加载用户数据失败');} finally {setLoading(false);}};const handleCreateUser = async (values) => {try {await djangoAPI.createUser(values);message.success('用户创建成功');setModalVisible(false);form.resetFields();loadUsers(); // 重新加载数据} catch (error) {message.error('创建用户失败');}};useEffect(() => {loadUsers();}, []);const columns = [{title: 'ID',dataIndex: 'id',key: 'id',},{title: '用户名',dataIndex: 'username',key: 'username',},{title: '邮箱',dataIndex: 'email',key: 'email',},{title: '操作',key: 'actions',render: (_, record) => (),},];return (
setModalVisible(false)}footer={null}>
); }; export default UserManager;

3.3 状态管理集成

Redux与Django集成:

// src/store/userSlice.js
import { createSlice, createAsyncThunk } from '@reduxjs/toolkit';
import djangoAPI from '../services/djangoAPI';
export const fetchUsers = createAsyncThunk(
'users/fetchUsers',
async (params, { rejectWithValue }) => {
try {
return await djangoAPI.getUsers(params);
} catch (error) {
return rejectWithValue(error.response.data);
}
}
);
export const createUser = createAsyncThunk(
'users/createUser',
async (userData, { rejectWithValue }) => {
try {
return await djangoAPI.createUser(userData);
} catch (error) {
return rejectWithValue(error.response.data);
}
}
);
const userSlice = createSlice({
name: 'users',
initialState: {
items: [],
loading: false,
error: null
},
reducers: {
clearError: (state) => {
state.error = null;
}
},
extraReducers: (builder) => {
builder
.addCase(fetchUsers.pending, (state) => {
state.loading = true;
state.error = null;
})
.addCase(fetchUsers.fulfilled, (state, action) => {
state.loading = false;
state.items = action.payload;
})
.addCase(fetchUsers.rejected, (state, action) => {
state.loading = false;
state.error = action.payload;
})
.addCase(createUser.fulfilled, (state, action) => {
state.items.push(action.payload);
});
}
});
export const { clearError } = userSlice.actions;
export default userSlice.reducer;

4. 高级集成特性

4.1 认证与授权

Django REST Framework认证:

# authentication.py
from rest_framework.authentication import SessionAuthentication, BasicAuthentication
from rest_framework_simplejwt.authentication import JWTAuthentication
class CsrfExemptSessionAuthentication(SessionAuthentication):
def enforce_csrf(self, request):
return  # 禁用CSRF检查,适用于移动端
# settings.py
REST_FRAMEWORK = {
'DEFAULT_AUTHENTICATION_CLASSES': [
'rest_framework.authentication.SessionAuthentication',
'rest_framework_simplejwt.authentication.JWTAuthentication',
],
'DEFAULT_PERMISSION_CLASSES': [
'rest_framework.permissions.IsAuthenticated',
]
}

React中的认证处理:

// src/hooks/useAuth.js
import { useState, useEffect, createContext, useContext } from 'react';
import djangoAPI from '../services/djangoAPI';
const AuthContext = createContext();
export const useAuth = () => {
const context = useContext(AuthContext);
if (!context) {
throw new Error('useAuth必须在AuthProvider内使用');
}
return context;
};
export const AuthProvider = ({ children }) => {
const [user, setUser] = useState(null);
const [loading, setLoading] = useState(true);
useEffect(() => {
checkAuth();
}, []);
const checkAuth = async () => {
try {
const userData = await djangoAPI.getCurrentUser();
setUser(userData);
} catch (error) {
setUser(null);
} finally {
setLoading(false);
}
};
const login = async (credentials) => {
try {
const userData = await djangoAPI.login(credentials);
setUser(userData);
return { success: true };
} catch (error) {
return {
success: false,
error: error.response?.data || '登录失败'
};
}
};
const logout = async () => {
await djangoAPI.logout();
setUser(null);
};
const value = {
user,
loading,
login,
logout,
isAuthenticated: !!user
};
return (
<AuthContext.Provider value={value}>{children}</AuthContext.Provider>);};

4.2 文件上传与处理

Django文件处理视图:

# views.py
from rest_framework.parsers import MultiPartParser, FormParser
from rest_framework.response import Response
from rest_framework.views import APIView
from django.core.files.storage import default_storage
class FileUploadView(APIView):
parser_classes = [MultiPartParser, FormParser]
def post(self, request, format=None):
file_obj = request.FILES['file']
# 保存文件
file_path = default_storage.save(f'uploads/{file_obj.name}', file_obj)
file_url = default_storage.url(file_path)
return Response({
'url': file_url,
'name': file_obj.name,
'size': file_obj.size
})

React文件上传组件:

// src/components/FileUpload.jsx
import React, { useState } from 'react';
import { Upload, Button, message, Progress } from 'antd';
import { UploadOutlined } from '@ant-design/icons';
import djangoAPI from '../services/djangoAPI';
const FileUpload = () => {const [uploading, setUploading] = useState(false);const [progress, setProgress] = useState(0);const handleUpload = async (file) => {setUploading(true);setProgress(0);try {await djangoAPI.uploadFile(file, (percent) => {setProgress(percent);});message.success('文件上传成功');} catch (error) {message.error('文件上传失败');} finally {setUploading(false);setProgress(0);}};return (
handleUpload(file)}showUploadList={false}disabled={uploading}>{uploading && ()}
); }; export default FileUpload;

5. 部署与优化

5.1 生产环境配置

Django静态文件配置:

# settings.py
STATIC_URL = '/static/'
STATIC_ROOT = BASE_DIR / 'staticfiles'
# 收集前端构建文件
STATICFILES_DIRS = [
BASE_DIR / 'frontend/build/static',  # React
BASE_DIR / 'frontend/dist/static',   # Vue
]
# WhiteNoise配置
MIDDLEWARE = [
'whitenoise.middleware.WhiteNoiseMiddleware',
# ...
]
STATICFILES_STORAGE = 'whitenoise.storage.CompressedManifestStaticFilesStorage'

前端构建配置:

// vue.config.js
module.exports = {
publicPath: process.env.NODE_ENV === 'production'
? '/static/'
: '/',
outputDir: '../backend/static/frontend',
indexPath: '../../templates/vue_index.html'
};
// package.json
{
"scripts": {
"build": "vue-cli-service build",
"build:django": "npm run build && cp -r dist/* ../backend/static/frontend/"
}
}

5.2 性能优化

Django数据库优化:

# views.py
class OptimizedUserAPI(APIView):
def get(self, request):
# 使用select_related和prefetch_related优化查询
users = User.objects.select_related('profile').prefetch_related(
'groups', 'user_permissions'
)[:100]  # 分页
serializer = UserSerializer(users, many=True)
return Response(serializer.data)

前端代码分割:

// React懒加载
const UserManager = lazy(() => import('./components/UserManager'));
const FileUpload = lazy(() => import('./components/FileUpload'));
// Vue异步组件
const AsyncComponent = () => ({
component: import('./components/AsyncComponent.vue'),
loading: LoadingComponent,
error: ErrorComponent,
timeout: 3000
});

6. 最佳实践总结

  1. API设计规范:遵循RESTful原则,保持接口一致性
  2. 错误处理:统一的错误响应格式和前端错误处理机制
  3. 安全性:CSRF保护、XSS防护、输入验证
  4. 性能监控:前后端性能指标收集和分析
  5. 开发体验:热重载、API Mock、调试工具集成

通过以上深度集成方案,Django与Vue.js、React可以实现完美的前后端协作,既保持了Django的强大后端能力,又充分发挥了现代前端框架的优秀用户体验。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/1195609.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

告别笨重 Jenkins,试试轻量级开源 CI/CD:Arbess

日常研发过程中&#xff0c;为了提高软件构建、发布、测试效率&#xff0c;快速交付系统&#xff0c;会使用一些CI/CD工具。Jenkins作为老牌的CI/CD工具&#xff0c;拥有强大的插件体系&#xff0c;但插件安装配置复杂、插件之间各种不兼容&#xff0c;Jenkins在用户权限管控方…

2026年北京美国本科留学机构服务机构解析:美国藤校申请 /美国本科申请 /美本活动规划 /美国留学招生官/美国本科前30深度解析

根据美国国际教育协会的公开数据,2024年中国留学生人数已连续多年稳居美国国际生源首位,其中本科阶段申请竞争尤为激烈。在此背景下,超过40%的申请者选择通过专业机构提升自身竞争力。北京作为全国教育资源中心,汇…

从功能到性价比,这款国产PCB设计软件值得推荐

在当前半导体产业链加速重构的背景下,国产PCB软件的重要性日益凸显。作为电子系统研发的关键环节,自主可控的EDA工具不仅关乎设计效率,更直接影响供应链安全。面对国外长期主导的市场格局,越来越多企业开始关注真正…

Day19简单和引用数据类型

<!DOCTYPE html> <html lang="en"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0">&…

南通红木沙发制造工厂、南通红木餐桌椅、南通缅甸花梨家具厂、南通苏作红木家具厂、小叶紫檀家具、明式家具定制工厂、清式家具工厂选择指南

2026热门红木衣柜定制优质工厂推荐行业背景与筛选维度说明据《2026-2030中国红木家具行业发展白皮书》数据显示,国内红木定制家具市场年复合增长率达12.3%,其中卧房红木衣柜定制需求年增速突破15%,成为红木家具细分…

2026年陕西省叛逆学校推荐TOP3:圆梦育德领衔,专业赋能青少年成长

在青少年成长过程中,叛逆、网瘾、厌学等问题常让家庭陷入困境。选择一所正规专业的叛逆教育学校,成为不少家长的迫切需求。本文基于办学资质、教学经验、口碑反馈等核心维度,筛选出2026年陕西省优质叛逆学校TOP3,涵…

max-num-batched-tokens计算方法

目录1️⃣ 参数本质回顾2️⃣ 理论计算方法3️⃣ 一般范围seq计算1️⃣ KV cache 本质2️⃣ 假设参数3️⃣ 代入公式4️⃣ 面试说明点 明白,你想深入了解 --max-num-batched-tokens 的范围和计算方法,不仅是经验值,…

2026年1月钛管/钛棒/钛锻件厂家Top5推荐:实力企业精选,覆盖多场景钛材需求

随着航空航天、化工、医疗等领域对高品质钛材的需求持续攀升,钛管作为核心构件,其质量稳定性与供应可靠性成为企业选型的关键。以下结合行业口碑、技术实力、产品覆盖度等多维度,精选5家优质钛管厂家,均为行业内真…

复健刷题日记

前言 因为高中毕业了,所以要打ACM了。但是刚升入西交,所以选择先花一个学期适应新生活,于是复健的任务自然而然拖到寒假才开始。 题单大部分来自300ids blog,可能会自己加一些其他的题。 争取寒假结束能回归CF正途…

丽水市莲都青田缙云遂昌松阳区英语雅思培训辅导机构推荐,2026权威出国雅思课程中心学校口碑排行榜推荐

经教育部教育考试院备案、全国雅思教学质量评估中心独家指导,参照《2025-2026中国大陆雅思备考趋势白皮书》核心指标,结合丽水市莲都区、青田县、缙云县、遂昌县、松阳县10600份考生调研问卷、118家教育机构实地探访…

2025年汽车托运行业口碑标杆企业,汽车托运推荐榜单技术实力与市场口碑领航者

随着汽车消费市场的持续活跃与人口流动性的增强,汽车托运服务已成为连接车主与目的地的重要桥梁。面对市场上众多的托运服务商,消费者往往难以抉择。一份基于公开市场数据、用户反馈及企业综合实力评估的榜单,或能为…

2026靠谱走心机厂家 TOP8 实力排名!台群精机蝉联头部

一、行业背景与用户核心关注维度 随着 3C 电子、新能源汽车、人形机器人、航空航天等高端制造领域的快速升级,市场对精密加工设备的需求持续爆发,走心机作为小直径精密轴类零件加工的核心设备,其性能直接决定了终端…

为什么你的MCP Server无法跨域?,3个关键配置项必须检查

第一章&#xff1a;为什么你的MCP Server无法跨域&#xff1f; 当你在开发 MCP&#xff08;Microservice Communication Protocol&#xff09;Server 时&#xff0c;可能会遇到前端请求被浏览器拦截的问题。这通常不是因为服务端逻辑错误&#xff0c;而是由于浏览器的同源策略阻…

不止于存储,更在于洞察:2026年值得关注的AI知识库+智能BI一体化私有部署解决方案提供商

在数字化转型加速的2026年,越来越多企业意识到:知识是核心资产,但若缺乏系统化管理,反而会成为负担。面对知识分散、信息孤岛、数据安全风险以及通用大模型“幻觉”频发等问题,企业亟需专业、安全、高效的知识库搭…

多协议可编程USB接口适配器USB2S,全面支持UART/I2C/SPI/CAN/1-Wire

多协议可编程USB接口适配器USB2S,全面支持UART/I2C/SPI/CAN/1-WireUSB2S(USB To Serial ports)是一款多功能可编程接口适配器,支持UART、I2C、SMBus、SPI、CAN、1-Wire等多种串行协议。它允许用户通过嵌入式编程自…

【Java基础】重写equals方法详讲,零基础入门到精通,收藏这篇就够了

一、重写equals方法 【Java比较学习】重写equals方法的安全写法 1、重写equals方法的两种方式 这里提供两个比较常见的equals重写方法&#xff1a; ● 用instanceof实现重写equals方法 ● 用getClass实现重写equals方法 先说结论&#xff0c;getClass()比instanceof更安全。…

2026年1月陕西省青少年戒网瘾学校推荐:三大头部机构专业解析

在数字化浪潮席卷的当下,青少年网络成瘾、行为叛逆等问题持续引发社会关注。陕西省作为教育大省,涌现出一批专业青少年教育机构,为家庭提供科学解决方案。本文基于陕西省教育部门公开数据及各校官方资料,从品牌实力…

QBrush之材质画刷(Qt::BrushStyle::TexturePattern)

1 void Widget::paintEvent(QPaintEvent *event)2 {3 Q_UNUSED(event);4 5 QPainter painter(this);6 7 painter.fillRect(this->rect(),QBrush(QColor(255,255,255)));8 painter.setRenderHint(QP…

飞书审批表单动态渲染 + Dify LLM意图识别 = 全自动审批路由(已落地金融客户,RPA替代率提升63%)

第一章&#xff1a;飞书审批流自动化落地的业务价值与技术全景 飞书审批流自动化作为企业数字化转型的核心环节&#xff0c;正在重塑组织内部协作与流程管理的方式。通过将传统人工驱动的审批流程转化为系统自动触发、条件判断与节点流转的机制&#xff0c;企业不仅提升了运营效…

不只替代,更要超越:国产芯片封装设计软件优选推荐

在当前全球半导体产业链加速重构的背景下,电子设计自动化(EDA)工具的自主可控已成为行业共识。上海弘快科技有限公司作为深耕电子设计自动化(EDA)软件开发领域的高新技术企业,凭借前沿的系统架构与算法技术,自主…