華文網

python:django中的csrf_token獲取不到錯誤,實際上是render的寫法不對

第一次搞django,記錄下問題和解決方法。

django自帶的Middleware中,有一項'django.middleware.csrf.CsrfViewMiddleware',這個是專門用於CSRF(csrf不懂的自行百度)使用的。

測試專案中的一個問題,先說下過程,註冊頁面中的html已經寫好了token,如下圖

views錯誤寫法:

這裡說明下 render_to_response 和 render 的區別:

自django1.3開始:render()方法是render_to_response的一個嶄新的快捷方式,前者會自動使用RequestContext。而後者必須coding出來,這是最明顯的區別,當然前者更簡潔。

return render_to_response('blog_add.html',{'blog': blog, 'form': form, 'id': id, 'tag': tag},

context_instance=RequestContext(request))

return render(request, 'blog_add.html', {'blog': blog, 'form': form, 'id': id, 'tag': tag})

locals()用法:locals()可以直接將函數中所有的變數全部傳給範本。當然這可能會傳遞一些多餘的參數,有點浪費記憶體的嫌疑。

return render(request, 'blog_add.html',locals())

如果按照錯誤的寫法你會一直無法註冊頁面會一直報錯如下圖


伺服器報錯如下:

經過一番查詢,最後鎖定到自己懷疑的地方,就是views中的render_to_response的問題,正確寫法如下:

真是坑了,官網也沒有看到相關解釋,如下圖

最後說明下,一開始一直在排查html中csrf的寫法和views使用csrf_protect裝飾器方式,一直不對症,真實的原因是render_to_response的方法使用問題,大家看懂的就記錄下吧,不懂的留言吧。小編會回復的。