django vue(手把手讲解)
💡一则或许对你有用的小广告
欢迎加入小哈的星球 ,你将获得:专属的项目实战(已更新的所有项目都能学习) / 1v1 提问 / Java 学习路线 / 学习打卡 / 每月赠书 / 社群讨论
- 新开坑项目:《Spring AI 项目实战》 正在持续爆肝中,基于 Spring AI + Spring Boot 3.x + JDK 21..., 点击查看 ;
- 《从零手撸:仿小红书(微服务架构)》 已完结,基于
Spring Cloud Alibaba + Spring Boot 3.x + JDK 17...
,点击查看项目介绍 ;演示链接: http://116.62.199.48:7070 ;- 《从零手撸:前后端分离博客项目(全栈开发)》 2 期已完结,演示链接: http://116.62.199.48/ ;
截止目前, 星球 内专栏累计输出 90w+ 字,讲解图 3441+ 张,还在持续爆肝中.. 后续还会上新更多项目,目标是将 Java 领域典型的项目都整一波,如秒杀系统, 在线商城, IM 即时通讯,权限管理,Spring Cloud Alibaba 微服务等等,已有 3100+ 小伙伴加入学习 ,欢迎点击围观
在 Web 开发领域,Django 和 Vue.js 是两颗耀眼的明星。Django 是 Python 后端框架的代表,以“快速开发”和“可扩展性”著称;Vue.js 则是前端框架中的佼佼者,凭借简洁的语法和灵活的组件化设计,成为构建现代化前端界面的首选。两者的结合,形成了前后端分离的典型技术栈,既能发挥 Python 的高效性,又能利用 JavaScript 的灵活性,为开发者提供了一种高效、优雅的解决方案。本文将从零开始,逐步解析 Django Vue 技术栈的核心概念、实战案例及优化策略,帮助读者构建出功能完善且体验流畅的 Web 应用。
Django:后端开发的“瑞士军刀”
核心优势与应用场景
Django 是一个基于 MVC(模型-视图-控制器)模式的全栈框架,其核心优势在于:
- 快速开发:内置 ORM(对象关系映射)系统,开发者无需直接编写 SQL 语句,即可通过 Python 代码操作数据库;
- 安全性:内置防止 SQL 注入、XSS 攻击等安全机制,降低漏洞风险;
- 可扩展性:支持丰富的第三方插件(如 Django REST Framework),方便快速集成新功能。
例如,在电商系统中,Django 可以快速搭建商品信息管理、用户认证、订单处理等模块,而无需从零开始编写底层逻辑。
Django REST Framework(DRF):构建 API 的利器
当与 Vue.js 结合时,Django 需要通过 RESTful API 与前端通信。此时,Django REST Framework(DRF) 是关键工具。它提供了以下核心功能:
- 序列化器(Serializer):将数据库模型转换为 JSON 格式,例如将
User
模型转换为{ "id": 1, "username": "admin" }
; - 视图集(ViewSet):通过继承
ViewSet
类,可以快速定义增删改查(CRUD)操作; - 认证与权限:支持 Token、OAuth 等认证方式,确保 API 的安全性。
代码示例:定义一个简单的 API 端点
from django.db import models
class Todo(models.Model):
title = models.CharField(max_length=100)
completed = models.BooleanField(default=False)
from rest_framework import serializers
from .models import Todo
class TodoSerializer(serializers.ModelSerializer):
class Meta:
model = Todo
fields = ['id', 'title', 'completed']
from rest_framework import viewsets
from .models import Todo
from .serializers import TodoSerializer
class TodoViewSet(viewsets.ModelViewSet):
queryset = Todo.objects.all()
serializer_class = TodoSerializer
Vue.js:前端开发的“积木系统”
组件化开发:以小见大
Vue.js 的核心理念是组件化开发,将复杂的界面拆解为可复用的小部件,例如按钮、表单、导航栏等。这种设计如同“乐高积木”,开发者可以自由组合这些组件,快速构建复杂界面。
代码示例:创建一个待办事项组件
<template>
<div class="todo-item">
<input type="checkbox" v-model="todo.completed">
<span :class="{ 'completed': todo.completed }">{{ todo.title }}</span>
</div>
</template>
<script>
export default {
props: {
todo: {
type: Object,
required: true
}
}
}
</script>
状态管理:Vuex 的“指挥中心”
当应用规模扩大时,组件间的状态传递可能变得复杂。此时,Vuex 作为 Vue 的状态管理库,扮演了“指挥中心”的角色:
- Store:集中存储全局状态(如用户信息、待办事项列表);
- Actions/Mutations:通过分层操作确保状态变更的可追溯性;
- Getter:提供计算属性,方便对状态进行衍生计算。
代码示例:Vuex 管理待办事项列表
// store.js
const store = new Vuex.Store({
state: {
todos: []
},
mutations: {
ADD_TODO(state, todo) {
state.todos.push(todo);
}
},
actions: {
async fetchTodos({ commit }) {
const response = await axios.get('/api/todos/');
commit('ADD_TODO', response.data);
}
}
});
前后端交互实战:以待办事项应用为例
架构设计与分工
假设我们要开发一个简单的待办事项(Todo)应用,其架构如下:
| 模块 | 负责方 | 职责描述 |
|---------------------|-----------------|-----------------------------------|
| 用户界面 | Vue.js | 展示待办事项列表、接收用户操作 |
| API 接口 | Django + DRF | 提供数据增删改查的接口 |
| 数据持久化 | Django | 使用 PostgreSQL 存储数据 |
步骤 1:Django 后端实现 API
- 创建模型:如前文的
Todo
模型; - 配置路由:使用
routers.DefaultRouter
自动生成 API 路径:
from django.urls import path, include
from rest_framework.routers import DefaultRouter
from .views import TodoViewSet
router = DefaultRouter()
router.register(r'todos', TodoViewSet)
urlpatterns = [
path('api/', include(router.urls)),
]
- 运行服务:通过
python manage.py runserver
启动后端,此时访问http://localhost:8000/api/todos/
可获取待办事项列表。
步骤 2:Vue.js 前端调用 API
- 安装 Axios:用于发送 HTTP 请求:
npm install axios
- 实现数据获取:在 Vue 组件中调用后端接口:
<template>
<div>
<ul>
<TodoItem v-for="todo in todos" :key="todo.id" :todo="todo" />
</ul>
</div>
</template>
<script>
import TodoItem from './components/TodoItem.vue';
import axios from 'axios';
export default {
components: {
TodoItem
},
data() {
return {
todos: []
};
},
async created() {
const response = await axios.get('/api/todos/');
this.todos = response.data;
}
}
</script>
优化与部署:让应用飞起来
性能优化策略
- 缓存机制:在 Django 中使用
Cache-Control
头或 Redis 缓存高频 API 请求; - 懒加载:Vue 中通过
v-lazy
指令优化图片加载,减少首屏时间; - 代码分割:利用 Vue CLI 的代码分割功能,按需加载组件。
部署方案:Docker + Nginx
将前后端打包为 Docker 镜像,通过 Nginx 反向代理实现统一入口:
server {
listen 80;
server_name example.com;
location / {
root /var/www/vue-app/dist;
try_files $uri $uri/ /index.html;
}
location /api/ {
proxy_pass http://django:8000;
proxy_set_header Host $host;
}
}
结论
Django Vue 技术栈通过清晰的分工与协作,为开发者提供了高效、可维护的解决方案。Django 的强大后端能力与 Vue.js 的灵活前端设计相辅相成,既能快速搭建复杂功能,又能保障用户体验的流畅性。随着项目规模的扩大,开发者可通过 Vuex 管理状态、DRF 扩展 API 功能,并结合 Docker 等工具实现一键部署,最终打造出一个既符合业务需求又具备高扩展性的 Web 应用。
希望本文能为读者提供一条清晰的学习路径,无论是初次接触前后端分离,还是希望优化现有技术栈,都能从中找到实用的思路与技巧。