Django中ajax發送post請求,報403錯誤CSRF驗證失敗解決辦法

今天學習Django框架,用ajax向后臺發送post請求,直接報了403錯誤,說CSRF驗證失敗;先前用模板的話都是在里面加一個 {% csrf_token %} 就直接搞定了CSRF的問題了;很顯然,用ajax發送post請求這樣就白搭了;

?文末已經更新更簡單的方法,上面的略顯麻煩

上網上查了一下,看了幾個別人的博客,才知道官網也早有說明解決辦法,大致流程就是:

?

就是新建一個JavaScript文件,然后把網上給的代碼粘貼進去,然后在你使用ajax的頁面把它引入一下;當然,如果你在網上找到的解決代碼包含JQuery的話,那就需要在引入的JQuery之后引入了(畢竟解決代碼不唯一,網上一找一堆,基本都是對的,原生JS和帶JQuery的都有);

文末會附上我使用的JS相關代碼,也可以去網上找!

?

如果上述沒有解決你的問題,那就說明你和我踩了同樣的一個小坑........

?

用了上面查到的方法,直接就解決了我的問題,但是隨著我對代碼修修改改、清除了相關頁面的cookie,吃個飯再運行,竟然又報403的CSRF錯誤了;百思不得其解的我又去Django官網看了一下相關部分的文檔,一堆英文看看大概找到了問題;

我發現我把html頁面里面原先加的 {% csrf_token %} 這個東西給刪掉了,加上谷歌的相關頁面cookie被我一清除,csrftoken就被咔嚓了,再刷新頁面,去html頁面里也找不到 {% csrf_token %} ,沒有了csrftoken那個cookie值,即使有相關的JS代碼也毛用沒有了;

?

打個比方:

  • 你吃飯需要工具,也就是筷子,但是飯都沒有,你拿個筷子吃什么呀!!!
  • 這里的筷子就是解決問題的JS代碼,而飯就是這個 {% csrf_token %} ,更確切說因該是瀏覽器中的叫 csrftoken 的 cookie;
  • 兩者都有了,才能徹底解決吃飯的問題;

?

總結下來:

  • 使用ajax發送post請求時,html頁面里一定要有?{% csrf_token %},在body里應該就沒什么大問題;
  • 然后引入相關的JS解決代碼;
  • 補充一下,和表單沒什么太大關系,因為我的html頁面里就沒有表單,直接通過點擊按鈕發送的ajax請求;

  

?

?

需要引入的相關JS代碼

?

?

 1 $(document).ajaxSend(function(event, xhr, settings) {
 2     function getCookie(name) {
 3         var cookieValue = null;
 4         if (document.cookie && document.cookie != '') {
 5             var cookies = document.cookie.split(';');
 6             for (var i = 0; i < cookies.length; i++) {
 7                 var cookie = jQuery.trim(cookies[i]);
 8                 // Does this cookie string begin with the name we want?
 9                 if (cookie.substring(0, name.length + 1) == (name + '=')) {
10                     cookieValue = decodeURIComponent(cookie.substring(name.length + 1));
11                     break;
12                 }
13             }
14         }
15         return cookieValue;
16     }
17     function sameOrigin(url) {
18         // url could be relative or scheme relative or absolute
19         var host = document.location.host; // host + port
20         var protocol = document.location.protocol;
21         var sr_origin = '//' + host;
22         var origin = protocol + sr_origin;
23         // Allow absolute or scheme relative URLs to same origin
24         return (url == origin || url.slice(0, origin.length + 1) == origin + '/') ||
25             (url == sr_origin || url.slice(0, sr_origin.length + 1) == sr_origin + '/') ||
26             // or any other URL that isn't scheme relative or absolute i.e relative.
27             !(/^(\/\/|http:|https:).*/.test(url));
28     }
29     function safeMethod(method) {
30         return (/^(GET|HEAD|OPTIONS|TRACE)$/.test(method));
31     }
32  
33     if (!safeMethod(settings.type) && sameOrigin(settings.url)) {
34         xhr.setRequestHeader("X-CSRFToken", getCookie('csrftoken'));
35     }
36 });

?簡單方法

  • 首先在你需要發起ajax post請求的頁面的里面隨便一個地方加上 {% crsr_token %}
  • 然后瀏覽器里查看源碼,會有這么一個隱藏標簽:<input type="hidden" name="csrfmiddlewaretoken" value="jlYb5LCP21TxGapw7OuO0xbHmRnyFzlgDapiDl1M1Vp6dOjPM4BlHOgOVeuPYQ27">
  • 在發起ajax post 請求時,組織json參數時,以下面這種方式使其成為參數,前兩個參數是我自定義的請自行忽略,其中鍵值對中的鍵名為input標簽的name名,值就為其value值
    csrf = $('input[name="csrfmiddlewaretoken"]').val();
    params = {'sku_id': sku_id, 'count': count, 'csrfmiddlewaretoken': csrf};
  • 這樣就可以把csrf中的參數傳遞給后端,就不會有403錯誤了,相比前面用了好大一段JS代碼要簡潔的多

?

轉載于:https://www.cnblogs.com/springionic/p/10816659.html

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

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

相關文章

如何在EXCEL中添加下拉框

篩選主要是將已有列的信息以下拉框的形式顯示出來 選中數據欄中的篩選按鈕即可生成 如果是想添加未有信息則如下圖步驟 首先&#xff0c;選擇你要出現下拉的區域&#xff0c;在數據欄中的選擇數據有效性 然后&#xff0c;下面對話框中&#xff0c;有效性條件中按如下設置即可&a…

每次新增頁面復制粘貼?100多行源碼的 element-ui 的新增組件功能教你解愁

1. 前言大家好&#xff0c;我是若川。最近組織了源碼共讀活動&#xff0c;感興趣的可以點此加我微信ruochuan12 參與&#xff0c;每周大家一起學習200行左右的源碼&#xff0c;共同進步。已進行三個月了&#xff0c;很多小伙伴表示收獲頗豐。想學源碼&#xff0c;極力推薦之前我…

原子設計_您需要了解的有關原子設計的4件事

原子設計重點 (Top highlight)Industries such as Architecture or Industrial Design have developed smart modular systems for manufacturing extremely complex objects like airplanes, ships, and skyscrapers. Inspired by this, Atomic Design was proposed as a syst…

深度學習 Caffe 初始化流程理解(數據流建立)

之前在簡書的文章&#xff0c;搬遷過來 ^-^ 本文是作者原創&#xff0c;如有理解錯誤&#xff0c;懇請大家指出&#xff0c;如需引用&#xff0c;請注明出處。 #Caffe FeatureMap數據流的建立 ##用語解釋 FeatureMap: 輸入的圖片信息或者經過多層處理后的圖片信息。weights: 只…

C#中的Clipboard與ContextMenuStrip應用舉例

今天&#xff0c;突然想起了怎樣在一個文本中實現復制、剪切與粘貼的功能&#xff0c;并給這些功能添加右鍵的快捷方式。于是&#xff0c;就用自己的VS2008寫了一個簡單的小應用&#xff0c;以熟悉C#中剪貼板與快捷菜單的使用。 首先&#xff0c;我們不難發現&#xff0c;剪貼板…

控制臺ui_設計下一代控制臺UI

控制臺ui游戲UX (GAMES UX) Yesterday’s Sony presentation showed us the final look of the PlayStation 5, as well as an impressive of next-gen games that will be released with it. What we didn’t get to see, however, is the new operating system and it’s use…

寫給前端新手看的一些模塊化知識

大家好&#xff0c;我是若川。最近組織了源碼共讀活動&#xff0c;感興趣的可以點此加我微信ruochuan12 進群參與&#xff0c;每周大家一起學習200行左右的源碼&#xff0c;共同進步。已進行三個月了&#xff0c;很多小伙伴表示收獲頗豐。一、 為什么需要模塊化以前沒有模塊化時…

重學前端學習筆記(八)--JavaScript中的原型和類

筆記說明 重學前端是程劭非&#xff08;winter&#xff09;【前手機淘寶前端負責人】在極客時間開的一個專欄&#xff0c;每天10分鐘&#xff0c;重構你的前端知識體系&#xff0c;筆者主要整理學習過程的一些要點筆記以及感悟&#xff0c;完整的可以加入winter的專欄學習【原文…

代碼實現照片素描_我的代碼素描之旅

代碼實現照片素描In 2018 I started the process of consistently creating and posting my code sketches online. These are small animations I make with code and post on instagram. Through these sketches I tried to visually express my ideas using color, animatio…

GCC參數詳解

轉自&#xff1a;http://www.cnblogs.com/fence/archive/2009/12/18/1627138.html GCC參數詳解 gcc and g分別是gnu的c & c編譯器 gcc/g在執行編譯工作的時候&#xff0c;總共需要4步1.預處理,生成.i的文件[預處理器cpp]2.將預處理后的文件不轉換成匯編語言,生成文件.s[編…

真效率神器,UI稿智能轉換成前端代碼,準確率極高

大家好&#xff0c;我是若川。在這充滿網絡促銷活動的幾個月&#xff0c;倍感壓力的&#xff0c;除了你的口袋&#xff0c;是否還有程序員的發量呢&#xff1f;每年的雙十一、雙十二購物狂歡節&#xff0c;各大電商平臺都會上線讓消費者充滿購買欲望的活動頁面&#xff0c;而這…

PPT圖標的正確使用和插入與編輯形狀

PPT圖標的正確使用和插入與編輯形狀 通過圖標可以以符號的形式直觀地傳遞信息。 一&#xff0c;實戰&#xff1a;在銷售工作計劃中插入圖標 PowerPoint 2016中提供了多種類型的圖標&#xff0c;用戶可根據需要在幻燈片中插入所需的圖標。 二&#xff0c;實戰&#xff1a;更改銷…

幾個用于序列化的代碼片段

參考JavaScriptSerializer,一般用來做JSON格式化http://msdn.microsoft.com/zh-cn/library/system.web.script.serialization.javascriptserializer.aspx http://msdn.microsoft.com/zh-cn/library/system.web.script.serialization.javascriptconverter.aspxDataContractSeria…

桌面圖標擺放圖案_用圖標制作醒目的圖案

桌面圖標擺放圖案Level up your video calls with a custom backdrop created using Noun Project icons.使用使用Noun Project圖標創建的自定義背景來升級視頻通話。 The only thing more visually pleasing than a well-designed icon is a neat, eye-catching pattern made…

3個多月,近3000人參與的源碼共讀,誠邀加入~

大家好&#xff0c;我是若川。眾所周知&#xff0c;從8月份開始&#xff0c;我組織了源碼共讀活動&#xff0c;每周學習200行左右的源碼&#xff0c;到現在持續了3個多月&#xff0c;堅持答疑解惑。幫助了不少人&#xff0c;還是挺開心的。另外&#xff0c;涌現了很多優秀的讀者…

upc 組隊賽18 STRENGTH【貪心模擬】

STRENGTH 題目鏈接 題目描述 Strength gives you the confidence within yourself to overcome any fears, challenges or doubts. Feel the fear and do it anyway! If you have been going through a rough time and feel burnt out or stressed, the Strength card encourag…

JSONNull

最近用JSONObject&#xff0c;感覺比xml好用一些&#xff0c;json的打包和解包都比較清晰和容易&#xff0c;最近遇到一個問題&#xff0c;將一個JSON對象解析&#xff0c;存到hashmap中去&#xff0c;然后再從hashmap取出數據&#xff0c;遇到jsonnull的問題&#xff0c;本以為…

“這張圖告訴你什么?”

For data to be impactful, it must be understood.為了使數據具有影響力&#xff0c;必須理解它。 I’ve happily spent hundreds and hundreds of hours of my life watching users misunderstand data visualizations. I’m strangely hooked on it.我快樂地度過了數百個小…

我們從 UmiJS 遷移到了 Vite

大家好&#xff0c;我是若川。最近組織了源碼共讀活動&#xff0c;感興趣的可以點此加我微信ruochuan12 進群參與&#xff0c;每周大家一起學習200行左右的源碼&#xff0c;共同進步。已進行三個月了&#xff0c;很多小伙伴表示收獲頗豐。我們從 UmiJS遷移到 Vite 已經上線半年…

將DataTable的內容以EXCEl的形式導出到本地

1.在搞項目的時候一般會遇到&#xff0c;將GridView或者Repeater的內容以Excel的形式保存到本地&#xff0c;即導出功能。我總結了兩個方法。 方法一&#xff1a; 1 DataTable dt query.GetItems().GetDataTable();2 if (dt ! null)3 {4 …