Python Django POST请求失败

Python Django POST请求失败,python,django,Python,Django,我在表单中使用帖子时出错,即使我在表单中添加了csrf_令牌 错误 禁止(403) CSRF验证失败。请求被中止 帮助 失败原因: 未设置CSRF cookie 通常,当存在真正的跨站点请求伪造,或者Django的CSRF机制未正确使用时,可能会发生这种情况。对于POST表单,您需要确保: •您的浏览器正在接受cookie。 •view函数使用RequestContext作为模板,而不是上下文。 •在模板中,每个以内部URL为目标的POST表单中都有一个{%csrf_token%}模板标记。 •

我在表单中使用帖子时出错,即使我在表单中添加了csrf_令牌

错误

禁止(403)

CSRF验证失败。请求被中止

帮助

失败原因: 未设置CSRF cookie

通常,当存在真正的跨站点请求伪造,或者Django的CSRF机制未正确使用时,可能会发生这种情况。对于POST表单,您需要确保: •您的浏览器正在接受cookie。 •view函数使用RequestContext作为模板,而不是上下文。 •在模板中,每个以内部URL为目标的POST表单中都有一个{%csrf_token%}模板标记。 •如果未使用CsrfViewMiddleware,则必须在使用csrf_令牌模板标记的任何视图以及接受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),
views.py
def搜索表格(请求):
返回render\u to\u response('search\u form.html')
def搜索(请求):
打印“request.post=”,request.post
打印“request.get=”,request.get
打印'request.method=',request.META.get('request\u method')
如果request.GET中的“q”:
消息='您搜索了:%r'%1请求。获取['q']
其他:
message='您提交了一个空表单'
返回HttpResponse(消息)
search-form.html
搜寻
{%csrf_令牌%}
url.py
urlpatterns=模式(“”,url(r’^$”,views.index,name='index'),
url(r“^meta/”,视图。显示“^meta,name='meta'),
url(r“^search form/$”,视图。搜索表单),
url(r“^search/”,views.search),

<代码> > p>你想看到点3。你正在返回一个普通的HttpResponse,所以我认为CSRF上下文处理器被跳过了。你可能想考虑使用它。而且,在你的模板中,表单方法是“POST”。,但在您的视图中,您正在检查request.GET。这与您遇到的CSRF问题无关,但可能是您需要解决的问题。

您尚未将令牌添加到表单中

您已经添加了代码
{%csrf_token%}
,但是没有使用
django.core.context_处理器.csrf
,因此模板标记实际上没有输出任何内容(模板标记会自动失败)

您不需要使用
HttpResponse
,而需要(使用)或just(为您处理)

另一方面,此操作不需要两个视图。
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\u 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>

{%if消息%}
{{message}}
{%else%}
{%csrf_令牌%}
{%endif%}