首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Django POST请求失败

Django POST请求失败
EN

Stack Overflow用户
提问于 2013-02-23 09:00:29
回答 2查看 2.1K关注 0票数 0

我在表单中使用POST时出现错误,即使我在表单中添加了一个csrf_token ...

错误

禁止(403)

CSRF验证失败。请求已中止。

帮助

失败原因:未设置CSRF cookie。

通常,当存在真正的跨站点请求伪造时,或者当Django的CSRF机制没有正确使用时,就会发生这种情况。对于POST表单,您需要确保:·您的浏览器接受cookies。·视图函数使用RequestContext作为模板,而不是上下文。·在模板中,每个针对内部csrf_token的POST表单中都有一个{% URL %}模板标签。·如果您没有使用CsrfViewMiddleware,那么您必须在任何使用csrf_token模板标记的视图以及接受POST数据的视图上使用csrf_protect。

您将看到此页面的帮助部分,因为您的Django设置文件中有DEBUG = True。将其更改为False,则只会显示初始错误消息。

您可以使用CSRF_FAILURE_VIEW设置自定义此页面。

代码语言:javascript
运行
复制
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),
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-02-23 16:16:40

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

您已经添加了代码{% csrf_token %},但是没有使用django.core.context_processors.csrf,所以模板标记实际上没有输出任何东西(模板标记静默地失败)。

除了使用HttpResponse,您还需要render_to_response() (具有RequestContext)或仅使用render() (它将为您处理RequestContext )。

换句话说,你不需要两个视图。search应该同时处理呈现表单和处理表单-

从django.shortcuts导入渲染

代码语言:javascript
运行
复制
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语句中,以实现与您现在正在做的相同的事情-

代码语言:javascript
运行
复制
<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>
票数 0
EN

Stack Overflow用户

发布于 2013-02-23 09:18:30

你想看看第3点here。您返回的是一个普通的HttpResponse,所以我认为csrf上下文处理器被跳过了。您可能会考虑改用django.shortcuts.render。另外,在你的模板中,你的表单方法是"post",但在你的视图中,你是在检查request.GET,这与你遇到的CSRF问题无关,但可能是你想要修复的问题。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15035761

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档