我已閱讀Django - CSRF verification failed以及與django和POST方法有關的幾個問題(和答案)。其中最好的,但並非工作換我的答案是https://stackoverflow.com/a/4707639/755319POST方法總是返回403 Forbidden
所有經批准的答案建議至少三件事情:
- 使用的RequestContext作爲render_to_response_call
- 添加的第三個參數{%csrf_token%}與POST方法
- 各種形式的檢查MIDDLEWARE_CLASSES settings.py中
我究竟做的建議,但錯誤依然出現了。我使用Django 1.3.1(Ubuntu的,從12.04庫)和Python 2.7(默認從Ubuntu的)
這是我的看法:
# Create your views here.
from django.template import RequestContext
from django.http import HttpResponse
from django.shortcuts import render_to_response
from models import BookModel
def index(request):
return HttpResponse('Welcome to the library')
def search_form(request):
return render_to_response('library/search_form.html')
def search(request):
if request.method=='POST':
if 'q' in request.POST:
q=request.POST['q']
bookModel = BookModel.objects.filter(title__icontains=q)
result = {'books' : bookModel,}
return render_to_response('library/search.html', result, context_instance=RequestContext(request))
else:
return search_form(request)
else:
return search_form(request)
,這是我的模板(search_form.html):
{% extends "base.html" %}
{% block content %}
<form action="/library/search/" method="post">
{% csrf_token %}
<input type="text" name="q">
<input type="submit" value="Search">
</form>
{% endblock %}
我已重新啓動服務器,但403禁止的錯誤仍然存在,告訴CSRF驗證失敗。
我有2個問題:
- 如何解決這個問題?
- 爲什麼在django中做一個「POST」很困難,我的意思是說有什麼特別的理由讓它變得如此冗長(我來自PHP,之前從未發現過這樣的問題)?
那的作品,謝謝您的回答。 但是如何以及爲什麼?你能解釋一下嗎? – goFrendiAsgard
https://docs.djangoproject.com/zh/dev/ref/contrib/csrf/#how-to-use-it - 閱讀要點#3 – zubinmehta
由於'csrf_token'必須在您的視圖中創建,因此django可以通過它的模板。在你的情況下,由於你的搜索視圖不會創建一個標記,所以你的模板中的'{%csrf_token%}'是'空字符串(None)'並且結果頁驗證失敗 – FallenAngel