關(guān)于django 1.10 CSRF驗(yàn)證失敗的解決方法
最近工作閑,沒(méi)事自學(xué)django,感覺(jué)這個(gè)最煩的就是各版本提供的api函數(shù)經(jīng)常有變化,不是取消了就是參數(shù)沒(méi)有了,網(wǎng)上搜到的帖子也沒(méi)說(shuō)明用的是什么版本的django,所以經(jīng)常出現(xiàn)搬運(yùn)過(guò)來(lái)的代碼解決不了問(wèn)題的情況,不過(guò)基本上遇到的坑不多,最坑的就是在提交post表單時(shí)弄了兩天的CSRF驗(yàn)證失敗問(wèn)題,特此記錄一下,我用的是django 1.10.3:
如果你不想使用這個(gè)功能,直接找到settings.py中的'django.middleware.csrf.CsrfViewMiddleware',這一行,直接給丫注釋掉,就不用啟動(dòng)CSRF檢查了,一了白了,當(dāng)然了如果你是練手的時(shí)候這么干還行,正式一點(diǎn)的項(xiàng)目還是啟用最好,省的被人搞跨站攻擊,到時(shí)候加班倒霉挨罵的還是你。
關(guān)于跨站攻擊簡(jiǎn)單說(shuō)一下我的理解,就是比如說(shuō)你登錄了一個(gè)交友網(wǎng)站后,才可以修改提交自己的基本資料,此時(shí)登錄后cooikes就被記錄到本機(jī)了,你的基友嫉妒你,他做了一個(gè)假頁(yè)面A發(fā)給你,引誘你點(diǎn)擊或填寫提交后,直接把數(shù)據(jù)提交給了真正的交友網(wǎng)站,由于你之前已經(jīng)登錄并且cooikes被記錄下來(lái)了,所以這次提交雖然是從假頁(yè)面A提交過(guò)去的,但是交友網(wǎng)站校驗(yàn)是通過(guò)的,所以就可以任意修改提交數(shù)據(jù),比如說(shuō)把你的年齡惡意修改成60的一個(gè)老頭兒,導(dǎo)致你長(zhǎng)期吃狗糧。。。
繼續(xù)說(shuō)正事,那么如果想開(kāi)啟怎么辦呢,首先把剛才注釋的'django.middleware.csrf.CsrfViewMiddleware'還是放開(kāi)吧,然后繼續(xù)如下步驟:
1、首先弄個(gè)表單提交頁(yè)面search_form_post.html(該頁(yè)面模擬搜索并顯示在數(shù)據(jù)庫(kù)里保存的汽車列表),注意在from表單內(nèi)增加{% csrf_token %}標(biāo)簽,代碼如下:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>搜索汽車</title> </head> <body> <form action="" method="post"> {% csrf_token %} <input type="text" name="q"><input type="checkbox" name="chk_contains">是否模糊搜索 <input type="submit" value="Search"> </form> {{ message }} <p> {% for car in car_list %} <li> {{ car.brand }} </li> {% endfor %} </body> </html>
2、在你的apps模塊的views.py增加一個(gè)處理搜索提交的方法,代碼如下:
from django.shortcuts import render def search_form_post(request): car_list = None if 'q' in request.POST: message = '你搜索的是: %r' % request.POST['q'] if 'chk_contains' in request.POST: car_list = Car.objects.filter(brand__contains=request.POST['q']) else: car_list = Car.objects.filter(brand=request.POST['q']) else: message = '請(qǐng)輸入要搜索的內(nèi)容并點(diǎn)擊搜索' return render(request, "search_form_post.html", {'message': message, 'car_list': car_list})
注意上邊關(guān)鍵的地方來(lái)了,django 1.10直接使用render方法就可以了,{% csrf_token %}標(biāo)簽才會(huì)被自動(dòng)替換為下圖一樣的隱藏域,我就是因?yàn)橛玫膅et_template("search_form_post.html").render(context),所以老是替換的值為空,因?yàn)楫?dāng)你使用這種方式加載模板的時(shí)候,不會(huì)自動(dòng)替換{% csrf_token %}標(biāo)簽,當(dāng)然也有解決辦法,就是使用context.update(csrf(request)),來(lái)自己替換,不過(guò)挺麻煩的,還是用render方法自動(dòng)替換方便
然后第三個(gè)參數(shù),一定要使用{}花括號(hào)的字典數(shù)據(jù)類型,不要使用什么元祖、列表之類的數(shù)據(jù)類型了,這樣模板內(nèi)的變量才能被正確替換顯示出來(lái),我被坑主要就是{% csrf_token %}標(biāo)簽不被自動(dòng)替換+模板內(nèi)變量不顯示,剩下的就是去urls.py里配置url去試試吧
以上這篇關(guān)于django 1.10 CSRF驗(yàn)證失敗的解決方法就是小編分享給大家的全部?jī)?nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
python對(duì)一個(gè)數(shù)向上取整的實(shí)例方法
在本篇文章中小編給大家整理了關(guān)于python對(duì)一個(gè)數(shù)向上取整的實(shí)例方法,需要的朋友們可以跟著學(xué)習(xí)下。2020-06-06使用Python實(shí)現(xiàn)企業(yè)微信通知功能案例分析
這篇文章主要介紹了使用Python實(shí)現(xiàn)企業(yè)微信通知功能,主要目的是通過(guò)企業(yè)微信應(yīng)用給企業(yè)成員發(fā)消息,通過(guò)案例分析給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-04-04解決python遞歸函數(shù)及遞歸次數(shù)受到限制的問(wèn)題
這篇文章主要介紹了解決python遞歸函數(shù)及遞歸次數(shù)受到限制的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-06-06Django中STATIC_ROOT和STATIC_URL及STATICFILES_DIRS淺析
這篇文章主要給大家介紹了關(guān)于Django中STATIC_ROOT和STATIC_URL及STATICFILES_DIRS的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起看看吧2018-05-05python3?flask使用連接池連接數(shù)據(jù)庫(kù)實(shí)例
這篇文章主要為大家介紹了python3?flask使用連接池連接數(shù)據(jù)庫(kù)實(shí)例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-08-08Python保存數(shù)據(jù)到文件的實(shí)現(xiàn)方式
這篇文章主要介紹了Python保存數(shù)據(jù)到文件的實(shí)現(xiàn)方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-11-11Python實(shí)現(xiàn)通過(guò)文件路徑獲取文件hash值的方法
這篇文章主要介紹了Python實(shí)現(xiàn)通過(guò)文件路徑獲取文件hash值的方法,結(jié)合實(shí)例形式分析了Python針對(duì)文件進(jìn)行hash運(yùn)算的實(shí)現(xiàn)方法與相關(guān)注意事項(xiàng),需要的朋友可以參考下2017-04-04Python自動(dòng)化爬取天眼查數(shù)據(jù)的實(shí)現(xiàn)
本文將結(jié)合實(shí)例代碼,介紹Python自動(dòng)化爬取天眼查數(shù)據(jù)的實(shí)現(xiàn),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-06-06