1

我有一个使用 Django 服务器端的 GWT Web 应用程序。我最近将 Django 升级到 1.2,但无法从我的 GWT 应用程序中获取 HTTP 帖子。我收到此错误:

CSRF 验证失败。请求中止。

失败原因:

CSRF token missing or incorrect.

我已经启用了适用于登录等贡献应用程序的 csrf 中间件('django.middleware.csrf.CsrfViewMiddleware'、'django.middleware.csrf.CsrfResponseMiddleware'),但似乎令牌没有被添加到发布的帖子中通过 GWT。有任何想法吗?提前致谢。

4

1 回答 1

0

如果您检查了模板,auth.login您会注意到 CSRF 令牌明确包含在<form>标签内。

<form method="post" action=".">
    {% csrf_token %}

GET当根据请求呈现页面时,这将扩展为隐藏字段。就像是:

<form method="post" action=".">
    <div style='display:none'>
        <input type='hidden' name='csrfmiddlewaretoken' 
             value='90064bf0e86edacfdb60595e3e2b8f23' />
    </div>

然后将此令牌传递回视图并进行POST验证。

因此,在您POST访问受 CSRF 保护的视图之前,您必须首先从所述视图中获取令牌。

POST在向视图发出请求之前,您能否验证/确保您手边有 CSRF 令牌?csrf_exempt或者,您可以使用装饰器禁用视图的 CSRF 保护。不过,这可能不是一个好主意。

更新

这就是我的问题的重点:我的前端没有使用 django 模板,因此我不能用令牌标记表单。我正在为我的前端使用 GWT,它正在为帖子呈现表单。

在呈现页面之前,您是否已经GET向 Django 视图发出请求?在这种情况下,您可以通过解析响应的内容来获取 CSRF 令牌。

如果不是,您将必须显式地GET向视图发出请求(假设它支持GET)并解析 CSRF 令牌的响应。例如,请参阅此问题

于 2010-09-20T06:32:23.007 回答