最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Django中ajax發(fā)送post請求 報403錯誤CSRF驗證失敗解決方案

 更新時間:2019年08月13日 10:11:50   投稿:yaominghui  
這篇文章主要介紹了Django中ajax發(fā)送post請求 報403錯誤CSRF驗證失敗解決方案,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下

前言

今天學(xué)習(xí)Django框架,用ajax向后臺發(fā)送post請求,直接報了403錯誤,說CSRF驗證失?。幌惹坝媚0宓脑挾际窃诶锩婕右粋€ {% csrf_token %} 就直接搞定了CSRF的問題了;很顯然,用ajax發(fā)送post請求這樣就白搭了;

文末已經(jīng)更新更簡單的方法,上面的略顯麻煩

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

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

文末會附上我使用的JS相關(guān)代碼,也可以去網(wǎng)上找!

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

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

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

打個比方:

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

總結(jié)下來:

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

需要引入的相關(guān)JS代碼

$(document).ajaxSend(function(event, xhr, settings) {
  function getCookie(name) {
    var cookieValue = null;
    if (document.cookie && document.cookie != '') {
      var cookies = document.cookie.split(';');
      for (var i = 0; i < cookies.length; i++) {
        var cookie = jQuery.trim(cookies[i]);
        // Does this cookie string begin with the name we want?
        if (cookie.substring(0, name.length + 1) == (name + '=')) {
          cookieValue = decodeURIComponent(cookie.substring(name.length + 1));
          break;
        }
      }
    }
    return cookieValue;
  }
  function sameOrigin(url) {
    // url could be relative or scheme relative or absolute
    var host = document.location.host; // host + port
    var protocol = document.location.protocol;
    var sr_origin = '//' + host;
    var origin = protocol + sr_origin;
    // Allow absolute or scheme relative URLs to same origin
    return (url == origin || url.slice(0, origin.length + 1) == origin + '/') ||
      (url == sr_origin || url.slice(0, sr_origin.length + 1) == sr_origin + '/') ||
      // or any other URL that isn't scheme relative or absolute i.e relative.
      !(/^(\/\/|http:|https:).*/.test(url));
  }
  function safeMethod(method) {
    return (/^(GET|HEAD|OPTIONS|TRACE)$/.test(method));
  }
 
  if (!safeMethod(settings.type) && sameOrigin(settings.url)) {
    xhr.setRequestHeader("X-CSRFToken", getCookie('csrftoken'));
  }
});

簡單方法

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

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • python web基礎(chǔ)之加載靜態(tài)文件實例

    python web基礎(chǔ)之加載靜態(tài)文件實例

    下面小編就為大家分享一篇python web基礎(chǔ)之加載靜態(tài)文件實例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-03-03
  • 對Python中g(shù)ensim庫word2vec的使用詳解

    對Python中g(shù)ensim庫word2vec的使用詳解

    今天小編就為大家分享一篇對Python中g(shù)ensim庫word2vec的使用詳解,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-05-05
  • python爬蟲破解字體加密案例詳解

    python爬蟲破解字體加密案例詳解

    這篇文章主要介紹了python爬蟲破解字體加密案例詳解,本文通過圖文實例相結(jié)合給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-03-03
  • Python?selenium?webdriver?基本使用代碼分享

    Python?selenium?webdriver?基本使用代碼分享

    這篇文章主要介紹了Python?selenium?webdriver?基本使用,本文僅僅簡單介紹了selenium的使用常用代碼分享,需要的朋友可以參考下
    2022-11-11
  • python 數(shù)據(jù)庫查詢返回list或tuple實例

    python 數(shù)據(jù)庫查詢返回list或tuple實例

    這篇文章主要介紹了python 數(shù)據(jù)庫查詢返回list或tuple實例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-05-05
  • python3簡單實現(xiàn)微信爬蟲

    python3簡單實現(xiàn)微信爬蟲

    我們可以通過python 來實現(xiàn)這樣一個簡單的爬蟲功能,把我們想要的代碼爬取到本地。下面就看看如何使用python來實現(xiàn)這樣一個功能。
    2015-04-04
  • python數(shù)據(jù)結(jié)構(gòu)輸入輸出及控制和異常

    python數(shù)據(jù)結(jié)構(gòu)輸入輸出及控制和異常

    這篇文章主要介紹了python數(shù)據(jù)結(jié)構(gòu)輸入輸出及控制和異常,上一章節(jié)中我們介紹了python的基礎(chǔ)數(shù)據(jù)類型和集合數(shù)據(jù)類型,這章節(jié)給大家介紹一下python的輸入輸出、控制和異常,對數(shù)據(jù)類型感興趣的同學(xué)可以查看一下文章<BR>
    2021-12-12
  • Python3-異步進(jìn)程回調(diào)函數(shù)(callback())介紹

    Python3-異步進(jìn)程回調(diào)函數(shù)(callback())介紹

    這篇文章主要介紹了Python3-異步進(jìn)程回調(diào)函數(shù)(callback())介紹,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-05-05
  • python3 http.client/server post傳輸json問題

    python3 http.client/server post傳輸json問題

    這篇文章主要介紹了python3 http.client/server post傳輸json問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-09-09
  • Python實現(xiàn)Kerberos用戶的增刪改查操作

    Python實現(xiàn)Kerberos用戶的增刪改查操作

    這篇文章主要介紹了Python實現(xiàn)Kerberos用戶的增刪改查操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-12-12

最新評論

张掖市| 彝良县| 阿拉善左旗| 西丰县| 东光县| 泾源县| 柳江县| 冷水江市| 江孜县| 琼海市| 新龙县| 西乌珠穆沁旗| 敖汉旗| 贺州市| 黄平县| 徐水县| 宣汉县| 上犹县| 罗平县| 买车| 泰来县| 水城县| 白河县| 临西县| 丹阳市| 叶城县| 宜章县| 抚顺县| 高唐县| 唐山市| 萝北县| 顺昌县| 石楼县| 山东省| 鹿邑县| 阳朔县| 武汉市| 招远市| 灌南县| 阿拉善右旗| 微山县|