django-open-id: CSRF 验证失败

1 投票
2 回答
1544 浏览
提问于 2025-04-16 14:24

我按照这个StackOverflow问题的推荐:用Django实现OpenID的最佳解决方案是什么?,为我的应用安装了django-openid-auth

但是我就是无法让它正常工作,每次尝试登录时总是出现CSRF验证失败。请求被中止。的错误。

django csrf

我检查了所有的地方:

1.

模板中有{% csrf_token %}

<form name="fopenid" action="{{ action }}" method="post">
    {% csrf_token %}
    <fieldset>
        <legend>Sign In Using Your OpenID</legend>
        <div class="form-row">
            <label for="id_openid_identifier">OpenID:</label><br />
            {{ form.openid_identifier }}
        </div>
        <div class="submit-row ">
            <input name="bsignin" type="submit" value="Log in">
        </div>
 {% if next %}
        <input type="hidden" name="next" value="{{ next }}" />
 {% endif %}
    </fieldset>
</form>

2.

django_openid_auth的views.py文件中,我发现他们使用了RequestContext

return render_to_response(template_name, {
                    'form': login_form,
                    redirect_field_name: redirect_to
                    }, context_instance=RequestContext(request))

3.

我的MIDDLEWARE_CLASSES中确实包含了CsrfViewMiddleware

MIDDLEWARE_CLASSES = (
    'django.middleware.common.CommonMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
)

我就是搞不懂还有什么地方可能出错?你们有什么想法吗?

我正在使用Django 1.3 beta版本。

更新

这似乎是我全局的问题。我创建了一个简单的表单,结果也是一样:

def index(request):
    return render_to_response('index.html',
                              locals(),
                              context_instance=RequestContext(request))

index.html:

<form action="/" method="post">
    {% csrf_token %}
    <input type="text" name="test">
    <input type="submit">
</form>

渲染后的HTML:

<form action="/" method="post">
    <div style="display:none"><input type="hidden" name="csrfmiddlewaretoken" value="1fbd5345560d325bf05809260f7d43c3"></div>
    <input type="text" name="test">
    <input type="submit">
</form>

到底哪里出错了!?

2 个回答

1

我试着用“manage.py runserver localhost:8000”来代替“manage.py runserver”,结果成功了。 我猜可能是因为主机名里的IP导致了一些cookie的问题。 顺便说一下,我在刚安装的Django 1.3上遇到了这个错误。

0

其实,我觉得这是我在Django中遇到的第一个问题。我把我的版本更新到了最新的1.3版,然后一切都开始正常工作了。真不错,Django的开发者们!

撰写回答