django 1.10 CSRF驗證失敗的解決過程,djangocsrf

來源:互聯網
上載者:User

django 1.10 CSRF驗證失敗的解決過程,djangocsrf

最近工作閑,沒事自學django,感覺這個最煩的就是各版本提供的api函數經常有變化,不是取消了就是參數沒有了,網上搜到的文章也沒說明用的是什麼版本的django,所以經常出現搬運過來的代碼解決不了問題的情況,不過基本上遇到的坑不多,最坑的就是在提交post表單時弄了兩天的CSRF驗證失敗問題,特此記錄一下,我用的是django 1.10.3:

 

如果你不想使用這個功能,直接找到settings.py中的'django.middleware.csrf.CsrfViewMiddleware',這一行,直接給丫注釋掉,就不用啟動CSRF檢查了,一了白了,當然了如果你是練手的時候這麼幹還行,正式一點的項目還是啟用最好,省的被人搞跨站攻擊,到時候加班倒黴挨罵的還是你。

 

 

關於跨站攻擊簡單說一下我的理解,就是比如說你登入了一個交友網站後,才可以修改提交自己的基本資料,此時登入後cooikes就被記錄到本機了,你的基友嫉妒你,他做了一個假頁面A發給你,引誘你點擊或填寫提交後,直接把資料提交給了真正的交友網站,由於你之前已經登入並且cooikes被記錄下來了,所以這次提交雖然是從假頁面A提交過去的,但是交友網站校正是通過的,所以就可以任意修改提交資料,比如說把你的年齡惡意修改成60的一個老頭兒,導致你長期吃狗糧。。。

 

繼續說正事,那麼如果想開啟怎麼辦呢,首先把剛才注釋的'django.middleware.csrf.CsrfViewMiddleware'還是放開吧,然後繼續如下步驟:

 

1、首先弄個表單提交頁面search_form_post.html(該頁面類比搜尋並顯示在資料庫裡儲存的汽車列表),注意在from表單內增加{% csrf_token %}標籤,代碼如下:

 1 <!DOCTYPE html> 2 <html lang="en"> 3 <head> 4     <meta charset="UTF-8"> 5     <title>搜尋汽車</title> 6 </head> 7 <body> 8     <form action="" method="post"> 9         {% csrf_token %}10         <input type="text" name="q"><input type="checkbox" name="chk_contains">是否模糊搜尋11         <input type="submit" value="Search">12     </form>13 {{ message }}14 <p>15 {% for car in car_list %}16     <li>17         {{ car.brand }}18     </li>19 {% endfor %}20 </body>21 </html>

 

2、在你的apps模組的views.py增加一個處理搜尋提交的方法,代碼如下:

 1 from django.shortcuts import render 2  3  4 def search_form_post(request): 5     car_list = None 6  7     if 'q' in request.POST: 8         message = '你搜尋的是: %r' % request.POST['q'] 9         if 'chk_contains' in request.POST:10             car_list = Car.objects.filter(brand__contains=request.POST['q'])11         else:12             car_list = Car.objects.filter(brand=request.POST['q'])13     else:14         message = '請輸入要搜尋的內容並點擊搜尋'15 16     return render(request, "search_form_post.html", {'message': message, 'car_list': car_list})

 

注意上邊關鍵的地方來了,django 1.10直接使用render方法就可以了,{% csrf_token %}標籤才會被自動替換為一樣的隱藏欄位,我就是因為用的get_template("search_form_post.html").render(context),所以老是替換的值為空白,因為當你使用這種方式載入模板的時候,不會自動替換{% csrf_token %}標籤,當然也有解決辦法,就是使用context.update(csrf(request)),來自己替換,不過挺麻煩的,還是用render方法自動替換方便

 

 

然後第三個參數,一定要使用{}花括弧的字典資料類型,不要使用什麼元祖、列表之類的資料類型了,這樣模板內的變數才能被正確替換顯示出來,我被坑主要就是{% csrf_token %}標籤不被自動替換+模板內變數不顯示,剩下的就是去urls.py裡配置url去試試吧

 

 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.