[英]Django POST request failing
我在表單中使用POST時出現錯誤,即使我已將csrf_token添加到我的表單中....
錯誤
禁止的(403)
CSRF驗證失敗。 請求中止。
救命
失敗原因:未設置CSRF cookie。
通常,當存在真正的跨站點請求偽造,或者Django的CSRF機制未正確使用時,可能會發生這種情況。 對於POST表單,您需要確保:•您的瀏覽器正在接受cookie。 •視圖函數使用RequestContext作為模板,而不是Context。 •在模板中,每個POST表單中都有一個{%csrf_token%}模板標記,用於定位內部URL。 •如果您不使用CsrfViewMiddleware,則必須在使用csrf_token模板標記的任何視圖以及接受POST數據的視圖上使用csrf_protect。
您正在看到此頁面的幫助部分,因為您的Django設置文件中有DEBUG = True。 將其更改為False,僅顯示初始錯誤消息。
您可以使用CSRF_FAILURE_VIEW設置自定義此頁面。
views.py
def search_form(request):
return render_to_response('search_form.html')
def search(request):
print 'request.post=', request.POST
print 'request.get=', request.GET
print 'request.method=', request.META.get('REQUEST_METHOD')
if 'q' in request.GET:
message = 'You searched for :%r' % request.GET['q']
else:
message = 'You submitted an empty form'
return HttpResponse(message)
search-form.html
<html>
<head>
<title>Search</title>
</head>
<body>
<form action="/polls/search/" method="post">{% csrf_token %}
<input type="text" name="q">
<input type="submit" value="Search">
</form>
</body>
</html>
urls.py
urlpatterns = patterns('',url(r'^$',views.index,name='index'),
url(r'^meta/',views.display_meta,name='meta'),
url(r'^search-form/$',views.search_form),
url(r'^search/',views.search),
你想在這里看到第3點。 你正在返回一個簡單的HttpResponse,所以我認為正在跳過csrf上下文處理器。 您可能需要考慮使用django.shortcuts.render 。 此外,在您的模板中,您的表單方法是“發布”,但在您的視圖中,您正在檢查request.GET。 這與您所擁有的CSRF問題無關,但可能是您想要解決的問題。
您尚未將令牌添加到表單中。
您已添加代碼{% csrf_token %}
,但未使用django.core.context_processors.csrf
,因此模板標記實際上並未輸出任何內容(模板標記無提示失敗)。
而不是使用HttpResponse
,你需要render_to_response()這個 (用的RequestContext )或只是渲染() (它處理的RequestContext你)。
另外,您不需要兩個視圖。 search
應處理渲染表單和處理表單 -
來自django.shortcuts導入渲染
def search(request):
if request.method == POST:
print 'request.post=', request.POST
print 'request.get=', request.GET
print 'request.method=', request.META.get('REQUEST_METHOD')
if 'q' in request.GET:
message = 'You searched for :%r' % request.POST['q']
else:
message = 'You submitted an empty form'
return render(request, 'search_form.html', {'message': message})
return render(request, 'search_form.html')
然后將{{ message }}
變量添加到search_form.html
模板中 - 可能在某種if語句中實現您現在正在執行的操作 -
<body>
{% if message %}
<div> {{ message }} </div>
{% else %}
<form action="/polls/search/" method="post">{% csrf_token %}
<input type="text" name="q">
<input type="submit" value="Search">
</form>
{% endif %}
</body>
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.