2013-05-06 32 views
2

我正在使用django 1.5.1,我必須在每個POST上使用{%csrf_token%}才能工作.RequestContext對我無效,這裏是我的設置,視圖代碼和模板代碼。django csrf令牌錯誤(RequestContext沒有工作)

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', 
) 

def show_rates(request, doc_id, template_name='rate.html'): 
    doc = get_object_or_404(Doctor, id=doc_id) 
    hos = doc.hospital 
    docts = hos.doctor_set.all() 
    page_title = doc.name 
    hos_name = hos.name 
    if request.method == "POST": 
     postdata = request.POST.copy() 
     form = AddToRateForm(postdata) 
    else: 
     form = AddToRateForm() 
    return render(request, template_name, locals()) 

<form method="POST" action="."> 
    {{ form.as_table }} 
    <div class="row-fluid"> 
     <div class="span10"> 
     </div> 
     <div class="span2"> 
      <button class="btn btn-block btn-primary" type="submit">Rate</button> 
     </div> 
    </div> 
</form> 

RequestContext不適用於我。我很困惑。

+3

你的模板是什麼樣的?你把令牌放在

內嗎?此外,使用本地化很酷,但它將視圖中的所有變量並將它們暴露給模板。這可能被證明不夠理想,因此您應該將您希望從視圖中獲得的所有內容都放到字典中併發送到您的模板。 – 2013-05-06 14:51:06

+0

你的意思是什麼都不起作用?你能提供一些模板並說出什麼不起作用嗎? – rjv 2013-05-06 15:41:57

回答

2

MIDDLEWARE_CLASSES看起來不錯。

這是您應該使用的基本代碼csrf

from django.shortcuts import render 
from django.views.decorators.csrf import csrf_exempt, csrf_protect 

@csrf_protect 
#@csrf_exempt says to make an exemption on csrf, but of course is not secure. 
#@csrf_exempt 
def show_rates(request, doc_id, template_name='rate.html'): 
    ... 
    #I suppose that locals() returns a dict() 
    return render(request, template_name, locals()) 


<form method="POST" action=""> 
    {# Don't forget the following line #} 
    {% csrf_token %} 
    {{ form.as_table }} 
    <div class="row-fluid"> 
     <div class="span10"> 
     </div> 
     <div class="span2"> 
      <button class="btn btn-block btn-primary" type="submit">Rate</button> 
     </div> 
    </div> 
</form> 
+0

有沒有辦法我可以避免每次添加表單文章時都鍵入{%csrf_token%}? – luthur 2013-05-06 23:38:34

+0

簡短的回答是否定的,你不能。你應該在你使用的每種表單中放置「{%csrf_token%}」(!僅適用於內部URL!)。如果你有很多表單,你可能會認爲把表單放在模板中。有關'csrf_token'的更多信息,請查看文檔https://docs.djangoproject.com/en/dev/ref/contrib/csrf/#how-to-use-it。 – CodeArtist 2013-05-06 23:59:24

+0

對不起,我之前使用過CsrfResponseMiddleware,並且我沒有看到Django1.4中引入了新的csrf文檔 – luthur 2013-05-06 23:59:27

0

嘗試更改您的視圖定義來添加這個裝飾:

@csrf_protect 
def show_rates(request, doc_id, template_name='rate.html'): 

和更新您的回報響應不包括context_instance。沒有必要真的。

return render_to_response(template_name, locals()) 
+0

仍然沒有工作........ – luthur 2013-05-06 15:46:43

+0

我已經添加了我的模板代碼 – luthur 2013-05-06 15:53:42

+0

對不起,我使用CsrfResponseMiddleware之前,我沒有看到在Django1.4中引入新的csrf文件 – luthur 2013-05-06 23:58:48