【玩转全栈】—— Django 连接 vue3 保姆级教程,前后端分离式项目2025年4月最新!!!
本文基于之前的一个旅游网站,实现 Django 连接 vue3,使 vue3 能携带 CSRF Token 发送 axios 请求给后端,后端再响应数据给前端。想要源码直接滑倒底部。
目录
实现效果
解决跨域
获取 csrf-token
什么是 csrf-token ?
CSRF攻击的工作原理
CSRF Token的作用
在前后端分离项目中的应用
问题
解决方案
Django 获取 CSRF Token
前端获取
配置 Vite 代理
下载 axios
请求 CSRF Token
运行前后端项目
请求与相应
请求
响应
后端返回数据
前端接收数据
源码获取
实现效果
Django5连接前端vue3,前后端分离式项目(Django+vue3+csrf-token+axios)
解决跨域
下载解决跨域的包:
pip install django-cors-headers
注册,并配置中间件
INSTALLED_APPS = ["corsheaders",
]
MIDDLEWARE.insert(0, 'corsheaders.middleware.CorsMiddleware')
允许其他端口来源(仅用于开发环境)
CORS_ALLOW_ALL_ORIGINS = True
获取 csrf-token
什么是 csrf-token ?
Django中的CSRF Token(Cross-Site Request Forgery Token,跨站请求伪造令牌)主要用于防止CSRF攻击。这是一种针对网站的恶意攻击模式,攻击者通过伪装来自受信任用户的请求来利用已认证的用户数据进行非法操作。
CSRF攻击的工作原理
假设你登录了一个银行网站,并且在没有登出的情况下访问了一个恶意网站。如果该银行网站对某些敏感操作(如转账)的安全措施不足,恶意网站可以通过自动提交表单或发送AJAX请求的方式,利用你的身份和已登录状态向银行网站发起转账请求。由于请求是从你的浏览器发出的,同时包含有效的会话Cookie,银行服务器无法区分这个请求是合法的还是伪造的,从而可能导致资金被非法转移。
CSRF Token的作用
为了防止上述情况发生,Django使用CSRF Token作为额外的安全层。具体工作流程如下:
-
生成Token:当用户访问一个包含表单的页面时,Django会在响应中设置一个名为
csrftoken的Cookie,并且在HTML表单中插入一个隐藏字段,其值为相同的CSRF Token。 -
验证Token:当用户提交表单时,无论是通过POST请求还是其他非安全方法(如PUT、DELETE等),Django都会检查请求中的CSRF Token是否与存储在Cookie中的Token相匹配。只有当两者匹配时,才会处理该请求;否则,请求将被拒绝并返回403 Forbidden错误。
-
安全性保障:这种方法有效地阻止了第三方网站直接构造请求并利用已登录用户的会话信息执行未授权操作的可能性,因为它们无法获取到正确的CSRF Token。
在前后端分离项目中的应用
在传统的Django项目中,模板渲染机制使得CSRF Token很容易集成进每个需要保护的表单或AJAX请求中。然而,在前后端分离的应用场景下,前端可能是一个独立运行的Vue.js、React或其他JavaScript框架开发的应用,这种情况下,获取和使用CSRF Token需要一些额外的工作,比如通过特定的API接口获取Token,并确保每次请求都正确地包含了这个Token。这通常涉及到在前端代码中添加逻辑来获取和附加CSRF Token到请求头中。
问题
Django 默认启用了 CSRF 保护机制,要求所有非安全 HTTP 方法(如 POST、PUT、DELETE)必须包含有效的 CSRF Token。如果前端未正确获取或发送 CSRF Token,就会触发以下错误:
CSRF verification failed. Request aborted.
CSRF cookie not set.
在传统的 Django 项目中,CSRF Token 通常是通过模板渲染(如 {% csrf_token %})或默认机制生成的,并存储在 Cookie 中,其中,{% csrf_token %}在我之前的所有 Django 教程中都在html页面中编写了。然而,在前后端分离的架构中:
- 前端和后端是独立运行的。
- 前端可能不会直接加载 Django 提供的页面,因此无法自动获取 CSRF Token。
解决方案
Django 获取 CSRF Token
Django 提供了一个专门的视图 /csrf/ ,可以用来手动获取 CSRF Token。你可以通过以下步骤实现:
配置 Django 视图
在 Django 的 urls.py 文件中添加一个视图来返回 CSRF Token:
from django.middleware.csrf import get_token
from django.http import JsonResponsedef get_csrf_token(request):token = get_token(request)return JsonResponse({'csrfToken': token})
然后在 urlpatterns 中注册该视图:
from django.urls import path
from . import viewsurlpatterns = [...path('csrf/', views.get_csrf_token, name='get_csrf_token'),
]
前端获取
配置 Vite 代理
import { defineConfig } from 'vite';
import vue from '@vitejs/plugin-vue';
import path from 'path';export default defineConfig({server: {proxy: {'/api': {target: 'http://127.0.0.1:8080', // 确保与 Django 后端地址一致changeOrigin: true,rewrite: (path) => path.replace(/^\/api/, ''),secure: false, // 如果后端使用 HTTPS,可能需要设置为 true},},},resolve: {alias: {'@': path.resolve(__dirname, 'src'),},},plugins: [vue()],
});
下载 axios
npm install axios
请求 CSRF Token
import axios from 'axios';let csrfToken = null;// 获取 CSRF Token
async function fetchCsrfToken() {try {const response = await axios.get('/api/csrf/');csrfToken = response.data.csrfToken;console.log("CSRF Token:", csrfToken);} catch (error) {console.error("Error fetching CSRF token:", error.response?.data || error.message);}
}fetchCsrfToken()
运行前后端项目
# 运行后端
python manage.py runserver 8080// 运行前端
npm run dev
后端处理请求:

前端获取到 token:
![]()
有了 token 之后,前端的一系列数据就能被后端安全接收,像用户管理之类的功能就能安全得进行了。
请求与相应
前端如何发送请求给 Django,Django 又如何相应数据给前端?
请求
前面讲的 前端获取 csrf-token 其实就是响应。配置 Vite 代理后,再使用 axios 发送请求给 Django:

这里我再给个示例:
前端通过 /api/ask 发送请求,携带 CSRF Token 请求头,将用户输入的 question 以 json 形式发POST 给 Django :
async function sendQuestion() {if (!csrfToken) {console.error("CSRF Token is not available");return;}try {const response = await axios.post('/api/ask/', { question: question.value }, {headers: {'X-CSRFToken': csrfToken, // 添加 CSRF Token 到请求头'Content-Type': 'application/json', // 指定内容类型为 JSON},});console.log("Response from Django:", response.data);} catch (error) {console.error("Error sending question:", error.response?.data || error.message);}
}
后端定义 url:
path('ask/', views.ai_talk, name='ai_talk'), # 使用类视图
视图函数接收前端的 POST 数据并解析:
def ai_talk(request):if request.method == 'POST':try:# 从请求体中获取 JSON 数据body = request.body.decode('utf-8') # 将字节流解码为字符串data = json.loads(body) # 将 JSON 字符串解析为 Python 字典# 获取用户输入的问题user_question = data.get('question', '').strip()print(f"用户输入的问题: {user_question}")except Exception as e:# 处理异常print(f"解析请求数据失败: {e}")return HttpResponse("请求数据无效", status=400)else:# 如果不是 POST 请求,返回错误return HttpResponse("仅支持 POST 请求", status=405)
得到数据:

响应
后端返回数据
Django 已经接收到了数据,可以通过 HttpResponse 或 JsonResponse 将数据返回,这里使用JsonResponse 以 json格式返回数据,仅需在视图函数中加入返回代码:
# 返回 JSON 响应
return JsonResponse({'status': 'success','message': ai_response,
})
前端接收数据
定义一个列表接收返回数据
const aiResponse = ref<string[]>([]); // 响应数据列表
在前端发送问题的同时,请求后端的响应:
// 发送问题到后端
async function sendQuestion() {if (!csrfToken) {console.error("CSRF Token is not available");return;}try {const response = await axios.post('/api/ask/', { question: question.value }, {headers: {'X-CSRFToken': csrfToken, // 添加 CSRF Token 到请求头'Content-Type': 'application/json', // 指定内容类型为 JSON},});// 获取后端返回的数据const responseData = response.data;console.log("Response from Django:", responseData);if (responseData.status === 'success') {//添加数据到相应列表aiResponse.value.push(responseData.message);} else {console.error("Error from backend:", responseData.message);}// 清空问题输入框question.value = '';} catch (error) {console.error("Error sending question:", error.response?.data || error.message);}
}
再显示到页面上。
源码获取
上面是 Django 代码,下面是 vue3 代码。

资源地址:https://download.csdn.net/download/2403_83182682/90578132
感谢您的观看!!!
相关文章:
【玩转全栈】—— Django 连接 vue3 保姆级教程,前后端分离式项目2025年4月最新!!!
本文基于之前的一个旅游网站,实现 Django 连接 vue3,使 vue3 能携带 CSRF Token 发送 axios 请求给后端,后端再响应数据给前端。想要源码直接滑倒底部。 目录 实现效果 解决跨域 获取 csrf-token 什么是 csrf-token ? CSRF攻击的…...
react中通过 EventEmitter 在组件间传递状态
要在 Reply 组件中通过 statusChangeEvent 发送状态值,并在 Select 组件中接收这个状态值 status,你可以按照以下步骤实现: //Event.jsimport EventEmitter from events;export const statusChangeEvent new EventEmitter();// 工单状态切换…...
数据库实验:分组查询与聚集函数的使用
目录 引言一、GROUP BY核心规则与常见错误二、高级分组选项:ROLLUP、CUBE与GROUPING SETS三、窗口函数:在原始行中显示分组聚合结果四、UNION ALL合并结果集:解决冗余查询问题五、实验体会 结语 (附上实验中表格的信息)…...
【mllm】——x64模拟htp的后端无法编译debug
mllm, qnn, x64 code:https://github.com/UbiquitousLearning/mllm 1. 问题 通过自定义qualcomm graph使用高通的htp后端进行llm推理,网络暂时只有mllm,和https://github.com/chraac/llama.cpp。qualcomm是支持x64模拟htp推理的,这样比较好d…...
计算机网络- UDP协议详解
UDP协议详解 5. UDP协议详解5.1 UDP协议基础5.1.1 UDP的基本概念5.1.2 UDP报文结构5.1.3 UDP校验和计算5.1.4 UDP在Linux内核中的实现UDP套接字的创建UDP数据的发送UDP数据的接收UDP校验和的计算 5.1.5 UDP的实际应用音视频流媒体在线游戏DNS查询VoIP通信网络时间同步 5.2 UDP编…...
Open-TeleVision源码解析——宇树摇操方案的重要参考:VR控制人形机器人采集数据
前言 本来针对Open-TeleVision的源码解析,是打算放在此文《从宇树摇操avp_teleoperate到unitree_IL_lerobot:如何基于宇树人形进行二次开发》中的,但考虑到为避免篇幅过长,故独立成此文 第一部分 Open-TeleVision的源码解析 如本…...
Embedding质量评估、空间塌缩、 Alignment Uniformity
Embedding质量的评估和空间塌缩的解决是自然语言处理(NLP)和推荐系统领域的关键问题。以下是综合多篇研究的总结: 一、Embedding质量评估方法 基准测试与任务指标 MTEB/C-MTEB:使用多语言或中文的基准测试集(如58个数据…...
[题解] Educational Codeforces Round 168 (Rated for Div. 2) E - level up
链接 思路 1 注意到在 k ∈ [ 1 , n ] k \in [1,n] k∈[1,n] 可以得到的最高等级分别为: n , n 2 , n 3 . . . . . n n n,\frac{n}{2},\frac{n}{3}.....\frac{n}{n} n,2n,3n.....nn, 总的个数是一个调和级数, s u m n ∗ ln n sumn*\ln n sumn∗lnn, 完全可以处…...
Lua 中的 table 类型详解
Lua 中的 table 类型详解 table 是 Lua 中唯一的数据结构机制,它实现了关联数组的功能,可以用来表示普通数组、序列、符号表、集合、记录、图、树等几乎所有数据结构。 基本特性 table 是 Lua 中唯一的数据结构类型可以包含任意类型的值(n…...
github进阶使用教程
目录索引 一、基本内容 repository fork star codespaces issue 在一个仓库创建话题讨论,可以由仓库主人选择开始和结束话题的讨论 pull request(也称 pr) 协同其他仓库开发,请求仓库主人拉取自己的代码合并到仓库的主分支&…...
推流265视频,网页如何支持显示265的webrtc
科技发展真快,以前在网页上(一般指谷歌浏览器),要显示265的视频流,都是很鸡肋的办法,要么转码,要么用很慢的hls,体验非常不好,而今谷歌官方最新的浏览器已经支持265的web…...
“破解”GPT-4o生图技术:万物皆可吉卜力的技术路线推测
👉目录 1 GPT-4o 的神奇魔法 2 GPT-4o 可能的技术路线推测 3 结语 最近 GPT-4o 生图模型横空出世,效果和玩法上都有突破性的进展,笔者整理了一下目前相关的技术,抛砖引玉一下,希望有更多大神分享讨论。 图源小红书恶魔…...
基于SpringBoot的电影订票系统(源码+数据库+万字文档+ppt)
504基于SpringBoot的电影订票系统,系统包含两种角色:管理员、用户主要功能如下。 【用户功能】 首页:浏览系统电影动态。 资讯信息:获取有关电影行业的新闻和资讯。 电影信息:查看电影的详细信息和排片情况。 公告信…...
07-算法打卡-链表-移除链表-leetcode(203)-第七天
1 题目地址 203. 移除链表元素 - 力扣(LeetCode)203. 移除链表元素 - 给你一个链表的头节点 head 和一个整数 val ,请你删除链表中所有满足 Node.val val 的节点,并返回 新的头节点 。 示例 1:[https://assets.leetc…...
[C++面试] 初始化相关面试点深究
一、入门 1、C中基础类型的初始化方式有哪些?请举例说明 默认初始化 对于全局变量和静态变量,基础类型(如int、float、double等)会被初始化为 0;而对于局部变量,其值是未定义的,包含随机…...
在线地图支持天地图和腾讯地图,仪表板和数据大屏支持发布功能,DataEase开源BI工具v2.10.7 LTS版本发布
2025年4月11日,人人可用的开源BI工具DataEase正式发布v2.10.7 LTS版本。 这一版本的功能变动包括:数据源方面,Oracle数据源支持获取和查询物化视图;图表方面,在线地图支持天地图、腾讯地图;新增子弹图&…...
粉末冶金齿轮学习笔记分享
有一段小段时间没有更新了,不知道小伙们有没有忘记我。最近总听到粉末冶金齿轮这个概念,花点时间来学习一下,总结一篇笔记分享给大家。废话不多说,直接开始: “粉末冶金”是一种制造工艺,包括在高压下压实…...
Retina:部署在神经硬件的SNN眼动追踪算法
论文链接:Retina : Low-Power Eye Tracking with Event Camera and Spiking Hardware 这是一篇发表在2024CVPRW上的文章,做了三个contribution: 将SNN放在Eye Tracking任务上。提出了Ini-30数据集部署到了Spike硬件上 还是挺有趣的。但是由于…...
OCR API识别对比
OCR 识别DEMO OCR识别 demo 文档由来 最开始想使用百度开源的 paddlepaddle大模型 研究了几天,发现表格识别会跨行,手写识别的也不很准确。最终还是得使用现成提供的api。。 文档说明 三个体验下来 腾讯的识别度比较高,不论是手写还是识别表…...
nodejs构建项目
从零到一搭建 Node.js 框架 搭建一个 Node.js 框架是理解 Web 应用架构的绝佳方式。本指南将带您完成创建一个轻量级但功能完善的 Node.js 框架的全过程,类似于 Express 或 Koa,但规模更小,便于理解。 目录 项目初始化创建核心应用类路由系…...
flutter 桌面应用之右键菜单
在 Flutter 桌面应用开发中,context_menu 和 contextual_menu 是两款常用的右键菜单插件,各有特色。以下是对它们的对比分析: context_menu 集成方式:通过 ContextMenuArea 组件包裹目标组件,定义菜单项。掘金…...
Cygwin编译安装Acise
本文记录Windows下使用Cygwin编译安装Acise的流程。 零、环境 操作系统Windows11Visual Studio CodeVisual Studio Code 1.92.0Cygwin 一、工具及依赖 1.1 Visual Studio Code 下载并安装Visual Studio Code, 同时安装以下插件, Task Explorer Output Colorizer …...
基于STM32、HAL库的IP6525S快充协议芯片简介及驱动程序设计
一、简介: IP6525S是一款高性能的同步降压DC-DC转换器芯片,具有以下特点: 输入电压范围:4.5V至32V 输出电压范围:0.8V至30V 最大输出电流:5A 效率高达95% 可编程开关频率(100kHz-1MHz) 支持PWM和PFM模式 内置过流保护、过温保护等功能 该芯片常用于工业控制、通信设备…...
RabbitMQ惰性队列的工作原理、消息持久化机制、同步刷盘的概念、延迟插件的使用方法
惰性队列工作原理 惰性队列通过尽可能多地将消息存储到磁盘上来减少内存的使用。与传统队列相比,惰性队列不会主动将消息加载到内存中,而是尽量让消息停留在磁盘上,从而降低内存占用。尽管如此,它并不保证所有操作都是同步写入磁…...
MySQL与Oracle深度对比
MySQL与Oracle深度对比:数据类型与SQL差异 一、数据类型差异 1. 数值类型对比 数据类型MySQLOracle整数TINYINT, SMALLINT, MEDIUMINT, INT, BIGINTNUMBER(精度) 或直接INT(内部仍为NUMBER)小数DECIMAL(p,s), FLOAT, DOUBLENUMBER(p,s), FLOAT, BINARY_FLOAT, BI…...
【Leetcode 每日一题】1922. 统计好数字的数目
问题背景 我们称一个数字字符串是 好数字 当它满足(下标从 0 0 0 开始)偶数 下标处的数字为 偶数 且 奇数 下标处的数字为 质数 ( 2 , 3 , 5 (2, \ 3, \ 5 (2, 3, 5 或 7 ) 7) 7)。 比方说,“2582” 是好数字,因为偶数下标处…...
pyqtgraph.opengl.items.GLSurfacePlotItem.GLSurfacePlotItem 报了一个错
1. 需求是这个样子的 有一个 pyqtgraph.opengl.GLViewWidget ,在应用启动时存在QMainWindow中,即父对象是QMainWindow,当业务需要时,修改它的父对象变为一个QDialog,可以让它从QMainWindow中弹出显示在QDialog里&#…...
【C++初学】课后作业汇总复习(六) 函数模板
1、函数模板 思考:如果重载的函数,其解决问题的逻辑是一致的、函数体语句相同,只是处理的数据类型不同,那么写多个相同的函数体,是重复劳动,而且还可能因为代码的冗余造成不一致性。 解决:使用…...
【第16届蓝桥杯C++C组】--- 数位倍数
Hello呀,小伙伴们,第16届蓝桥杯也完美结束了,无论大家考的如何,都要放平心态,今年我刚上大一,也第一次参加蓝桥杯,刷的算法题也只有200来道,但是还是考的不咋滴,但是拿不…...
ASP.NET Core 性能优化:客户端响应缓存
文章目录 前言一、什么是缓存二、客户端缓存核心机制:HTTP缓存头1)使用[ResponseCache]属性(推荐)2)预定义缓存配置(CacheProfile)3)手动设置HTTP头4)缓存验证机制&#…...
