VUE django 跨域、csrf令牌的問題
跨域問題
使用VUE django前后分離,跨域跟django CSRF令牌是個(gè)很頭疼問題,跨域問題解決方法很多,bing一下就有很多這里先略過,主要講一下令牌用法,取消令牌檢測這里有提到django開發(fā)。
django前后分離 CSRF獲取及使用
首先要獲取CSRF令牌,django中GET請求是不會(huì)進(jìn)行CSRF驗(yàn)證的,這里我們可以創(chuàng)建一個(gè)django視圖,前端通過GET請求來獲取,
Django 配置
1、獲取token的視圖
這里我寫了兩個(gè):
- 第一個(gè)是前端發(fā)送GET請求直接獲取
- 第二個(gè)是為了服務(wù)端處理登錄請求時(shí)候 通過后將token以及登錄所需的信息一并傳遞給前端
為什么想了兩個(gè),是因?yàn)閼校绻加玫谝环N,后端需要處理一下json數(shù)據(jù),就直接復(fù)制只傳遞token字符串,在封裝成json給前端。
def get_csrf_token(request): csrf_token = get_token(request) print(csrf_token) return JsonResponse({'csrfToken': csrf_token}) # return csrf_token def get_csrf_token1(request): csrf_token = get_token(request) print(csrf_token) return csrf_token
2、后端settings配置文件,需要配置以下信息。
CORS_ALLOW_HEADERS = [ 'XMLHttpRequest', 'X_FILENAME', 'accept-encoding', 'authorization', 'content-type', 'dnt', 'origin', 'user-agent', 'x-csrftoken', 'x-requested-with', 'Pragma', # 添加其他你需要的請求頭,這里比較多 ] MIDDLEWARE = [ 'corsheaders.middleware.CorsMiddleware', #放到前邊 'django.middleware.security.SecurityMiddleware', 'django.contrib.sessions.middleware.SessionMiddleware', 'django.middleware.common.CommonMiddleware', 'django.middleware.csrf.CsrfViewMiddleware', #還有這個(gè) 'django.contrib.auth.middleware.AuthenticationMiddleware', 'django.contrib.messages.middleware.MessageMiddleware', 'django.middleware.clickjacking.XFrameOptionsMiddleware', 'sbh_bly_api.middleware.CustomExceptionMiddleware', ] # 配置CSRF的信任域,與跨域配置相同,這個(gè)很重要,我就是因?yàn)檫@個(gè)卡了一天 CSRF_TRUSTED_ORIGINS = [ 'http://127.0.0.1:8080', # 確保與前端地址匹配 ]
3、VUE前端配置
注意我的VUE項(xiàng)目用的ts,如果用js的請自行轉(zhuǎn)換一下。
1) axios封裝,這里對axios請求做了封裝 http.ts文件,這里的代碼,是將token存儲(chǔ)到了 store中,這里是取值“const token = store.state.token” 根據(jù)實(shí)際項(xiàng)目,和習(xí)慣來確定存儲(chǔ)位置。
// http.ts import axios, { AxiosInstance, AxiosRequestConfig, AxiosResponse } from 'axios'; import store from '@/store'; // 創(chuàng)建 Axios 實(shí)例 const instance: AxiosInstance = axios.create({ baseURL: 'http://127.0.0.1:8000', headers: { 'Content-Type': 'application/json' }, }); // 請求攔截器 import axios, { AxiosInstance, AxiosRequestConfig, AxiosResponse } from 'axios'; import store from '@/store'; // 創(chuàng)建 Axios 實(shí)例 const instance = axios.create({ baseURL: 'http://127.0.0.1:8000', timeout: 3000, headers: { 'Content-Type': 'application/json' }, }); // 請求相關(guān)處理 請求攔截 在請求攔截中可以補(bǔ)充請求相關(guān)的配置 // interceptors axios的攔截器對象 instance.interceptors.request.use(config => { // config 請求的所有信息 // console.log(config); const token = localStorage.token config.headers['X-CSRFToken'] = token return config // 將配置完成的config對象返回出去 如果不返回 請求講不會(huì)進(jìn)行 }, err => { // 請求發(fā)生錯(cuò)誤時(shí)的相關(guān)處理 拋出錯(cuò)誤 Promise.reject(err) }) instance.interceptors.response.use(res => { // 我們一般在這里處理,請求成功后的錯(cuò)誤狀態(tài)碼 例如狀態(tài)碼是500,404,403 // res 是所有相應(yīng)的信息 console.log(res) return Promise.resolve(res) }, err => { // 服務(wù)器響應(yīng)發(fā)生錯(cuò)誤時(shí)的處理 Promise.reject(err) }) export default instance;
2)main.ts配置項(xiàng),在main中配置開啟 axios 請求時(shí)發(fā)送請求頭
import axios from 'axios'; axios.defaults.withCredentials = true;
3)get 請求獲取令牌
import axios from '@/http' const get_token = () => { console.log("aa") var post_data = JSON.stringify({ username: "123", password: "1234" }) axios({ method: 'GET', url: axios.defaults.baseURL + '/api/get-csrf-token/', data: post_data }) .then(function (response) { console.log(document.cookie) // const token = document.cookie.split('=')[1]; //請求成功,處理業(yè)務(wù)邏輯 console.log(response.data.csrfToken) // store.state.token =token // 保存token store.state.token =response.data.csrfToken }) .catch(function (error) { //請求失敗,處理業(yè)務(wù)邏輯 console.log(error) }) }
如果不成功請留言我們一起解決
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
Vue3中集成高德地圖并實(shí)現(xiàn)平移縮放功能
隨著前端技術(shù)的不斷發(fā)展,地圖應(yīng)用在我們的項(xiàng)目中越來越常見,本文將介紹如何在Vue3項(xiàng)目中集成高德地圖,并通過簡單的配置實(shí)現(xiàn)地圖的平移和縮放功能,需要的朋友可以參考下2024-09-09在vue中獲取token,并將token寫進(jìn)header的方法
今天小編就為大家分享一篇在vue中獲取token,并將token寫進(jìn)header的方法,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-09-09vue+AI智能機(jī)器人回復(fù)功能實(shí)現(xiàn)
這篇文章主要為大家詳細(xì)介紹了vue+AI智能機(jī)器人回復(fù)功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-07-07vue2.0實(shí)現(xiàn)音樂/視頻播放進(jìn)度條組件
這篇文章主要為大家詳細(xì)介紹了vue2.0實(shí)現(xiàn)音樂和視頻播放進(jìn)度條組件的思路及具體實(shí)現(xiàn)方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-06-06vue實(shí)現(xiàn)移動(dòng)端input上傳視頻、音頻
這篇文章主要為大家詳細(xì)介紹了vue實(shí)現(xiàn)移動(dòng)端input上傳視頻、音頻,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-08-08