【玩轉全棧】—— 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作為額外的安全層。具體工作流程如下:

  1. 生成Token:當用戶訪問一個包含表單的頁面時,Django會在響應中設置一個名為csrftoken的Cookie,并且在HTML表單中插入一個隱藏字段,其值為相同的CSRF Token。

  2. 驗證Token:當用戶提交表單時,無論是通過POST請求還是其他非安全方法(如PUT、DELETE等),Django都會檢查請求中的CSRF Token是否與存儲在Cookie中的Token相匹配。只有當兩者匹配時,才會處理該請求;否則,請求將被拒絕并返回403 Forbidden錯誤。

  3. 安全性保障:這種方法有效地阻止了第三方網站直接構造請求并利用已登錄用戶的會話信息執行未授權操作的可能性,因為它們無法獲取到正確的CSRF Token。

在前后端分離項目中的應用

????????在傳統的Django項目中,模板渲染機制使得CSRF Token很容易集成進每個需要保護的表單或AJAX請求中。然而,在前后端分離的應用場景下,前端可能是一個獨立運行的Vue.js、React或其他JavaScript框架開發的應用,這種情況下,獲取和使用CSRF Token需要一些額外的工作,比如通過特定的API接口獲取Token,并確保每次請求都正確地包含了這個Token。這通常涉及到在前端代碼中添加邏輯來獲取和附加CSRF Token到請求頭中。

問題

Django 默認啟用了 CSRF 保護機制,要求所有非安全 HTTP 方法(如 POSTPUTDELETE)必須包含有效的 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 之后,前端的一系列數據就能被后端安全接收,像用戶管理之類的功能就能安全得進行了。

請求與相應

前端如何發送請求給 DjangoDjango 又如何相應數據給前端?

請求

前面講的 前端獲取 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

感謝您的觀看!!!

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

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

相關文章

dify部署,ollama部署,拉取模型,創建ai聊天應用

dify下載安裝 dify1.0.1 windos安裝包百度云盤地址 通過網盤分享的文件&#xff1a;dify-1.0.1.zip 鏈接: 百度網盤 請輸入提取碼 提取碼: 1234 dify安裝包 linux安裝包百度云盤地址 通過網盤分享的文件&#xff1a;dify-1.0.1.tar.gz 鏈接: 百度網盤 請輸入提取碼 提取碼…

docx文檔轉為pdf文件響應前端

1、轉換文件&#xff08;docx~pdf&#xff09; 1.引入pom依賴 <dependency><groupId>com.aspose</groupId><artifactId>aspose-words</artifactId><version>20.12.0</version> </dependency>2.讀取docx文檔數據-轉換 // 初…

網絡安全中信息收集需要收集哪些信息了?匯總

目錄 1. 域名信息 2. IP地址與網絡信息 3. 備案與注冊信息 4. Web應用與中間件信息 5. 操作系統與服務器信息 6. 敏感文件與配置文件 7. 社交工程信息 8. 證書與加密信息 9. API與接口信息 10. 外部威脅情報 11. 歷史數據與緩存 常用工具與技術&#xff1a; 在網絡…

【鋰電池SOH預測】PSO-BP鋰電池健康狀態預測,鋰電池SOH預測(Matlab完整源碼和數據)

預測效果 基于PSO-BP算法的鋰電池健康狀態預測研究 一、引言 1.1 研究背景與意義 在當今社會&#xff0c;鋰電池憑借其高能量密度、長壽命及環境友好等特性&#xff0c;在現代能源系統中占據著舉足輕重的地位。從消費電子領域如智能手機、筆記本電腦&#xff0c;到動力領域中…

智能車攝像頭開源—9 動態權、模糊PID、速度決策、路徑優化

目錄 一、前言 二、動態權 1.概述 2.偏差值加動態權 三、模糊PID 四、速度決策 1.曲率計算 2.速度擬合 3.速度控制 五、路徑 六、國賽視頻 一、前言 在前中期通過識別直道、彎道等元素可進行加減速操作實現速度的控制&#xff0c;可進一步縮減一圈的運行速度&#xff…

過往記錄系列 篇五:市場黑天鵝事件歷史梳理

文章目錄 系列文章文章地址文章摘要文章預覽系列文章 過往記錄系列 篇一:牛市板塊輪動順序梳理 過往記錄系列 篇二:新年1月份(至春節前)行情歷史梳理 過往記錄系列 篇三:春節行情歷史梳理 過往記錄系列 篇四:年報月行情歷史梳理 文章地址 原文審核不通過(理由:“違反…

Mysql--基礎知識點--85.1--Innodb自適應哈希索引

1. 自適應哈希索引的用途 InnoDB 的自適應哈希索引&#xff08;Adaptive Hash Index, AHI&#xff09;是 MySQL 數據庫引擎中一項智能優化查詢性能的功能。其核心作用如下&#xff1a; 加速等值查詢 哈希索引通過哈希函數將鍵映射到固定位置&#xff0c;實現 O(1) 時間復雜度的…

SQL優化技術分享:從 321 秒到 0.2 秒的性能飛躍 —— 基于 PawSQL 的 TPCH 查詢優化實戰

在數據庫性能優化領域&#xff0c;TPC-H 測試集是一個經典的基準測試工具&#xff0c;常用于評估數據庫系統的查詢性能。本文將基于 TPCH 測試集中的第 20個查詢&#xff0c;結合 PawSQL 自動化優化工具&#xff0c;詳細分析如何通過 SQL 重寫和索引設計&#xff0c;將查詢性能…

SpringBoot3-web開發筆記(下)

內容協商 實現&#xff1a;一套系統適配多端數據返回 多端內容適配&#xff1a; 1. 默認規則 SpringBoot 多端內容適配。 基于請求頭內容協商&#xff1a;&#xff08;默認開啟&#xff09; 客戶端向服務端發送請求&#xff0c;攜帶HTTP標準的Accept請求頭。 Accept: applica…

Graylog 索引配置詳解與優化建議

Graylog 索引配置詳解與優化建議 &#x1f680; 前言一、索引集基礎信息 &#x1f4da;二、分片&#xff08;Shards&#xff09;與副本&#xff08;Replicas&#xff09;設置 ??1. 分片 (Shards)2. 副本 (Replicas) 三、 字段類型刷新間隔&#xff08;Field Type Refresh Int…

數據結構*包裝類泛型

包裝類 什么是包裝類 在講基本數據類型的時候&#xff0c;有提到過包裝類。 基本數據類型包裝類byteByteshortShortintIntegerlongLongfloatFloatdoubleDoublecharCharacterbooleanBoolean 我們知道&#xff1a;基本數據類型并不是對象&#xff0c;沒有對象所具有的方法和屬…

【JDBC-54.1】MySQL JDBC連接字符串常用參數詳解

在Java應用程序中連接MySQL數據庫時&#xff0c;JDBC連接字符串是建立連接的關鍵。一個配置得當的連接字符串不僅能確保連接成功&#xff0c;還能優化性能、增強安全性并處理各種連接場景。本文將深入探討MySQL JDBC連接字符串的常用參數及其最佳實踐。 1. 基本連接字符串格式…

[ctfshow web入門] web37

信息收集 題目有了變化&#xff0c;include$c if(isset($_GET[c])){$c $_GET[c];if(!preg_match("/flag/i", $c)){include($c);echo $flag;}}else{highlight_file(__FILE__); }解題 通過協議解題 參考[ctfshow web入門] web31 同樣是include&#xff0c;之前的方…

Linux 調試代碼工具:gdb

文章目錄 一、debug vs release&#xff1a;兩種程序形態的本質差異1. 什么是 debug 與 release&#xff1f;2. 核心差異對比 二、為什么需要 debug&#xff1a;從項目生命周期看調試價值1. 項目開發流程中的調試閉環&#xff08;流程圖示意&#xff09;2. Debug 的核心意義與目…

Python設計模式:命令模式

1. 什么是命令模式&#xff1f; 命令模式是一種行為設計模式&#xff0c;它將請求封裝為一個對象&#xff0c;從而使您能夠使用不同的請求、隊列或日志請求&#xff0c;以及支持可撤銷操作。 命令模式的核心思想是將請求的發送者與請求的接收者解耦&#xff0c;使得兩者之間的…

nlp面試重點

深度學習基本原理&#xff1a;梯度下降公式&#xff0c;將損失函數越來越小&#xff0c;最終預測值和實際值誤差比較小。 交叉熵&#xff1a;-p(x)logq(x)&#xff0c;p(x)是one-hot形式。如果不使用softmax計算交叉熵&#xff0c;是不行的。損失函數可能會非常大&#xff0c;…

Leetcode:二叉樹

94. 二叉樹的中序遍歷 class Solution {public List<Integer> inorderTraversal(TreeNode root) {TreeNode cur root;Stack<TreeNode> stack new Stack<>();List<Integer> list new ArrayList<>();while (!stack.isEmpty() || cur ! null) {…

SQL:Constraint(約束)

目錄 &#x1f3af; 什么是 Constraint&#xff1f; MySQL 中常見的約束類型&#xff1a; 1. PRIMARY KEY 2. FOREIGN KEY 3. UNIQUE 4. NOT NULL 5. DEFAULT 6. CHECK&#xff08;MySQL 8.0&#xff09; 7. AUTO_INCREMENT &#x1f3af; 什么是 Constraint&#xf…

數據庫數據恢復——sql server數據庫被加密怎么恢復數據?

SQL server數據庫數據故障&#xff1a; SQL server數據庫被加密&#xff0c;無法使用。 數據庫MDF、LDF、log日志文件名字被篡改。 數據庫備份被加密&#xff0c;文件名字被篡改。 SQL server數據庫數據恢復過程&#xff1a; 1、將所有數據庫做完整只讀備份。后續所有數據恢…

MySQL 用 limit 影響性能的優化方案

一.使用索引覆蓋掃描 如果我們只需要查詢部分字段&#xff0c;而不是所有字段&#xff0c;我們可以嘗試使用索引覆蓋掃描&#xff0c;也就是讓查詢所需的所有字段都在索引中&#xff0c;這樣就不需要再訪問數據頁&#xff0c;減少了隨機 I/O 操作。 例如&#xff0c;如果我們…