1

我正在尝试在支持常规登录(通过 Flask-Security)和 OAuth 登录(通过 Flask-Social)的 Flask 中实现登录/注册视图。

我的网站使用 CSRF 保护,但是当我实现到 OAuth 登录页面的链接时(根据 Flask-Social示例项目),我收到了 CSRF 错误。这是模板:

{% extends "base.html" %}
{% from "security/_macros.html" import render_field_with_errors, render_field %}
{% block title %}Login{% endblock %}
{% block body %}
    <h1>Login</h1>
    {% include "security/_messages.html" %}
    <form action="{{ url_for_security('login') }}" method="POST"
        name="login_user_form">
        {{ login_user_form.hidden_tag() }}
        {{ render_field_with_errors(login_user_form.email,
            class="form-control", placeholder="Your email") }}
        {{ render_field_with_errors(login_user_form.password,
            class="form-control", placeholder="Password") }}
        {{ render_field(login_user_form.remember) }}
        {{ render_field(login_user_form.next) }}
        {{ render_field(login_user_form.submit, class="btn btn-primary") }}
    </form>
    <form action="{{ url_for('social.login', provider_id='google') }}"
        name='google_login_form' method="POST">
        <input class="btn btn-primary btn-large" type="submit"
            name="login_google" value="Login with Google" >
    </form>
    {% include "security/_menu.html" %}
{% endblock %}

问题似乎是第二个form没有 CSRF 字段;我该怎么办?

4

1 回答 1

0

你应该遵循Flask-WTF文档来使用没有表单的模板。

根据文档,在应用程序中

from flask_wtf.csrf import CsrfProtect

CsrfProtect(app)

并在模板中

<form method="post" action="/">
    <input type="hidden" name="csrf_token" value="{{ csrf_token() }}" />
</form>

你的第二种形式是

<form action="{{ url_for('social.login', provider_id='google') }}"
    name='google_login_form' method="POST">
    <input type="hidden" name="csrf_token" value="{{ csrf_token() }}" />
    <input class="btn btn-primary btn-large" type="submit"
        name="login_google" value="Login with Google" >
</form>
于 2014-05-09T02:59:06.873 回答