2012-02-09 24 views
2

過去兩天通過谷歌,stackoverflow和docs.djangoproject.com翻閱CSRF問題的解決方案。CSRF令牌丟失或不正確(我知道,它之前已被問過!)

免責聲明,我是Django的初學者,並且沿着本書 django的權威指南 - web開發正確。好了,顯然我得到的東西錯了:-(

見下面這樣的一個嘗試,看看你是否能指出任何錯誤,因爲我已經試過計算器上所有的建議,但沒有運氣尚未:

view.py:

from django.shortcuts import render_to_response 
from django.template import RequestContext 

def add_vehicle(request): 
    return render_to_response('vehicle.html', RequestContext(request, {})) 

vehicle.html:

{% extends "base.html" %} 
{% block title %}Vehicle Registration{% endblock %} 
{% block content %} 
<html> 
<head> 
</head> 
<body> 

<form action="/vehicle/" method="post"> {% csrf_token %} 
    <table width=100%> 
     <tr> 
      <td>Reg #:</td> 
      <td><input type="text" name="regnumber"></td> 
      <td></td> 
     </tr> 
     <tr> 
      <td>Model:</td> 
      <td><input type="text" name="model"></td> 
      <td></td> 
     </tr> 
     <tr> 
      <td>Manufacturer:</td> 
      <td><input type="text" name="manufacturer"></td> 
      <td></td> 
     </tr> 
     <tr> 
      <td>Year:</td> 
      <td><input type="text" name="year"></td> 
      <td></td>  
     </tr> 
     <tr> 
      <td>Chassis #:</td> 
      <td><input type="text" name="chasisnumber"></td> 
      <td></td>  
     </tr> 
     <tr> 
      <td></td> 
      <td><input type="submit" value="Submit"> 
      <input type="submit" value="Clear"> 
      </td> 
      <td></td>  
     </tr> 
    </table> 
</form> 
</body> 
</html> 
{% endblock %} 

我希望這不是太多的代碼爲stackoverflow。

現在,我不斷收到 CSRF令牌丟失或不正確

請協助。

編輯(添加上錯誤的詳細信息)

settings.py看起來像這樣:

MIDDLEWARE_CLASSES = (
'django.middleware.common.CommonMiddleware', 
'django.contrib.sessions.middleware.SessionMiddleware', 
'django.middleware.csrf.CsrfViewMiddleware', 
'django.contrib.auth.middleware.AuthenticationMiddleware', 
'django.contrib.messages.middleware.MessageMiddleware', 
) 

這裏是控制檯顯示,當我打開vehicle.html頁:

warnings.warn("A {% csrf_token %} was used in a template, but the context did not provide the value. This is usually caused by not using RequestContext.") 
+0

-1:「我知道,它以前被問過!」但是你拒絕搜索它或引用它?很不禮貌。 – 2012-02-09 03:21:04

+0

對不起,出現粗魯。但是我看了所有提出的問題和提供的所有答案,並且覺得在同樣的問題上增加了另一個問題,但是我沒有替代方案。其實目的是告訴我,我很欣賞這個問題是重複的,但沒有回答我的具體情況。我的錯 – lukik 2012-02-09 06:40:22

+0

你有沒有在Apache下的mod_wsgi中運行多個Django站點? – 2012-02-09 10:44:05

回答

4

選擇render_to_response用於簽名是render_to_response(template_name[, dictionary][, context_instance][, mimetype])所以你應該等它調用下面,以確保CSRF令牌被放入背景?

return render_to_response('vehicle.html', {}, context_instance= RequestContext(request))` 
+0

@lukik:請在**問題**中包含錯誤消息作爲**更新**。不要將重要事實添加爲評論。 – 2012-02-09 10:43:25

+0

@ S.Lott:注意。感謝您的更正。 – lukik 2012-02-09 16:10:51

+0

@lukik:你發佈的代碼不是**完全**,就像這個答案。請修正您的代碼並**更新**問題以顯示您實際使用的實際代碼。 – 2012-02-09 16:24:47

0

您應該查看本文檔 https://docs.djangoproject.com/en/dev/ref/contrib/csrf/

您可能缺少中間件

+0

我有中間件: ** ** settings.py 'MIDDLEWARE_CLASSES =( 'django.middleware.common.CommonMiddleware', 'django.contrib.sessions.middleware.SessionMiddleware', ' django.middleware。 csrf.CsrfViewMiddleware ' 'django.contrib.auth.middleware.AuthenticationMiddleware', 'django.contrib.messages.middleware.MessageMiddleware', )' – lukik 2012-02-09 06:47:50

+0

@lukik:請包括在**問題的代碼樣品**作爲**更新**。不要在評論中添加代碼。 – 2012-02-09 10:42:44

相關問題