Неудачные ошибки csrf для формы входа на основе Flask-wtf

{csrf_token': [u'CSRF failed']} 

ошибка появляется в браузере Chrome, работающем в Windows 8. Firefox не выдает эту ошибку. Это фляжное приложение, а форма входа сделана с использованием wtforms.

 <form action="{{url_for('login')}}" name="login" method="post" class="form-horizontal">
  {{form.csrf_token}}
  <h2>{{form_title}}</h2>
  <hr>
  <ul><li class="label">{{form.username.label  }}</li>
    <li class="input">{{render_field(form.username)}}</li>
    <li class="desc">{{form.username.description}}</li>
  </ul>
  <ul><li class="label">{{form.password.label  }}</li>
    <li class="input">{{render_field(form.password)}}</li>
    <li class="desc">{{form.password.description}}</li>
  </ul>
  <ul><li class="label">{{form.remember.label  }}</li>
    <li class="input">{{render_field(form.remember)}}</li>
    <li class="desc">{{form.remember.description}}</li>
  </ul>
  <input type="submit" class="sbutton" value="Log In" />
</form>

Невозможно отследить что-либо еще... распечатка form.errors показывает указанную выше ошибку csrf_token.

По совпадению, когда я пытаюсь войти в систему с помощью того же браузера Chrome для stackoverflow, он говорит, что сторонние файлы cookie отключены .... может ли это быть причиной вышеуказанного поведения? Любые указатели полезны...

вот виды:

class Login(MethodView):
def __init__(self):
    self.form = LoginForm()

def get(self):
    return render_template('login.html',form=self.form,form_title="Login User")

def post(self):
    username = self.form.username.data
    password = self.form.password.data

    log_handle.debug(self.form.data.items())
    if self.form.validate_on_submit():
        qstr = "SELECT * FROM user_account WHERE email='%s'"%(username)
        try:
            cursor.execute(qstr)
        except Exception:
            log_handle.exception("Could not execute:%s"%(qstr))
            flash("Could not log you on. Consult admin")
            redirect(url_for("index"))

        try:
            a = cursor.fetchall()
        except Exception:
            log_handle.exception("Could not fetch of data from:%s"%(qstr))
            flash("Could not log you on. Consult admin")
            redirect(url_for("index"))


        #now create a object understood by the flask-login
  #now create a object understood by the flask-login
        fuser = Login_user(name=a[0]['username'],id=a[0]['id'],active=a[0]['is_active'],user_role=a[0]["role"])

        remember = request.form.get("remember", "no") == "yes"
        if login_user(fuser,remember):
            session['language'] = app.config['BABEL_DEFAULT_LOCALE']
            #set customer type session variables
            a = SessionVar()
            a.set_customer_type()

            flash("Logged in!")
            return redirect(url_for("campaign_mod"))
        else:
            flash("Sorry, but you could not log in.")
    else:
        flash("failed csrf token")
        log_handle.debug(self.form.errors)
        log_handle.debug(self.form.data.items())
        return render_template('403.html'), 403

и формы:

class LoginForm(Form):
username   = TextField(_(u"Email"),[validators.Required(),validators.Email()],description="use your email as your username")
password   = PasswordField(_(u"password"),[validators.Required()],description="Your password")
remember   = BooleanField(_(u"Remember Me."),default=True,
                                     description=_(u"This will store a cookie so as to restore it when you revisit the site."))
def validate_password(form,field):
    #now check if the username and password are correct combination.
    qstr = "SELECT * FROM user_account WHERE email='%s'"%(form.username.data)
    cursor.execute(qstr)
    a = cursor.fetchall()

    if len(a) > 0:
        hpasswd = a[0]['password']
        if bcrypt.hashpw(form.password.data, hpasswd) != hpasswd:
            log_handle.debug('password did not  match')
            raise ValidationError('cannot find a valid combination of username / password. Please try again.')
    else:
        raise ValidationError('cannot find a valid username. Please try again.')

person user1102171    schedule 07.01.2013    source источник
comment
Можете ли вы поделиться кодом для входа в систему?   -  person codegeek    schedule 07.01.2013
comment
Попробуйте проверить, правильно ли вы установили настройки. Особенно SERVER_NAME или другие, связанные с файлами cookie. Подробнее: flask.pocoo.org/docs/config/#builtin-configuration- значения   -  person Ignas Butėnas    schedule 08.01.2013
comment
Я попробовал сегодня с хромом на ubuntu, и он отлично работает. Так что это означает, что это конкретная проблема Windows. ....   -  person user1102171    schedule 08.01.2013
comment
Когда вы смотрите на отрендеренный html, видите ли вы скрытое поле с tokeny выглядящей вещью в нем? Когда вы просматриваете POST в отладчике вашего браузера или прокси-сервере, видите ли вы закодированное в форме поле с именем csrf или что-то подобное?   -  person nsfyn55    schedule 06.05.2014
comment
возможный дубликат Flask-WTF - validate_on_submit() никогда не выполняется   -  person nsfyn55    schedule 18.06.2014


Ответы (1)


Попробуйте заменить {{form.csrf_token}} на {{form.hidden_tag()}}

Моя гипотеза заключается в том, что хром не отправляет csrf_value скрытого тега.

Чтобы проверить, верна ли эта гипотеза, вам нужно проверить, что вы получаете на flask.request.form["csrf_token"] после публикации формы. Если вы ничего не получите, то моя гипотеза, вероятно, верна.

Что касается того, что может быть причиной этого, я знаю, что в XHTML вы не можете вкладывать элементы ввода в элемент формы. Вот почему Flask-WTF имеет особый способ добавления скрытых тегов, см. эту страницу документа.

person Walter Cacau    schedule 17.08.2013