gpt4 book ai didi

python-3.x - flask_wtf.csrf CSRF token 不匹配 - 无法修复 flask 错误消息

转载 作者:行者123 更新时间:2023-12-05 07:28:46 26 4
gpt4 key购买 nike

这是我在登录表单验证时收到的消息:

session: <SecureCookieSession {}>
request.form: ImmutableMultiDict([('eventid', ''), ('csrf_token', 'ImI1N2EwYjFjZmIxZDI4YjQ3ZTIxM2VmNGNkOGQzZTEzYzBiM2U4MzEi.DsNqRA.sw618M5laiwyElfOJ9mAIAAOXig'), ('password', 'admin'), ('username', 'admin'), ('submit', 'Sign In')])
INFO:flask_wtf.csrf:The CSRF tokens do not match.
127.0.0.1 - - [06/Nov/2018 19:18:57] "POST / HTTP/1.1" 200 -
INFO:werkzeug:127.0.0.1 - - [06/Nov/2018 19:18:57] "POST / HTTP/1.1" 200 -

我打印表单数据和session,看起来session是空的。

我明白, session 必须有 token ,但它丢失了,我不知道我需要做什么才能在 session 中获得所需的数据。我关注了this tutorial看来,这一切都必须自动设置。

以前我没有使用 flask_wtf 并且一切正常。我检查了所有关于不匹配 token 或丢失 token 的可用问题,但我无法使用他们的建议解决我的问题。

这是我的文件:

__init__.py

#!/usr/bin/env python3

import os

from flask import Flask
from flask_sqlalchemy import SQLAlchemy

from config import Config


app = Flask(__name__)
app.config.from_object(Config)
db = SQLAlchemy(app)

# register blueprints
from app.auth import auth
app.register_blueprint(auth.bp)

观点:auth.py

from flask import (
Blueprint,
flash,
g,
redirect,
render_template,
request,
session,
url_for,
)
from werkzeug.security import check_password_hash, generate_password_hash

from app import db
from app.auth.forms import LoginForm
from app.models import User


bp = Blueprint('auth', __name__)


@bp.route('/', methods=('GET', 'POST'))
@bp.route('/login/', methods=('GET', 'POST'))
def login():
print('session:', session)
form = LoginForm()
print('request.form:', request.form)
if form.validate_on_submit():
print('Form is valid')
eventid = form.eventid.data
username = form.username.data
password = form.password.data
# validate login
user = User.query.filter_by(username=username.lower()).first()
error = None
if not user or not check_password_hash(user.password, password):
error = 'Incorrect username-password combination.'

if not error:
session.clear()
session['user_id'] = user.id
return redirect(url_for('performance.index'))

flash(error)

return render_template('auth/login.html', title='Sign In', form=form)

形式:表单.py

from flask_wtf import FlaskForm
from wtforms import (
BooleanField,
PasswordField,
StringField,
SubmitField,
)
from wtforms.validators import DataRequired


class LoginForm(FlaskForm):
eventid = StringField('Event ID')
username = StringField('Username', validators=[DataRequired()])
password = PasswordField('Password', validators=[DataRequired()])
submit = SubmitField('Sign In')

模板:login.html

{% extends 'base.html' %}

{% block header %}
<h3>{% block title %}{{ title }}{% endblock %}</h3>
{% endblock %}

{% block content %}
<form action="" method="post">
<div class="form-group">
<label class="col-sm-12" for="username">
{{ form.username.label }}
</label>
{{ form.username() }}
</div>
<div class="form-group">
<label class="col-sm-12" for="password">
{{ form.password.label }}
</label>
{{ form.password() }}
</div>
<div class="form-group">
<label class="col-sm-12" for="eventid">
{{ form.eventid.label }}
</label>
{{ form.eventid() }}
</div>
<div class="form-group">
{{ form.submit }}
</div>
{{ form.hidden_tag() }}
</form>
{% endblock %}

配置:config.py

import os


class Config:
instance_path = '/some/path/to/instance/'
SECRET_KEY = os.environ.get('SECRET_KEY') or 'you-will-never-guess'
DATABASE = os.path.join(instance_path, 'app.sqlite')
SQLALCHEMY_DATABASE_URI = ('sqlite:///' + os.path.join(instance_path,
'app.sqlite'))
SQLALCHEMY_TRACK_MODIFICATIONS = False

我已经尝试了所有的命题,我能够找到:- 我在模板中设置了hidden_​​tag();- 我在配置中设置了SECRETE_KEY;- 我尝试将 FlaskForms 更改为 Forms;- 其他解决方案。

他们都没有帮助。我已经坐了三个晚上了。任何建议都会很好。

更新

如果我不使用 Blueprint,即如果我使用 @app.route(...) 而不是 @bp.route(... ) 在我的 auth.py 中,我能够登录,尽管 session 仍然是空的。所以,现在我不明白蓝图的问题。

最佳答案

我想你从教程中跳过了这部分:

The form.hidden_tag() template argument generates a hidden field that includes a token that is used to protect the form against CSRF attacks. All you need to do to have the form protected is include this hidden field and have the SECRET_KEY variable defined in the Flask configuration. If you take care of these two things, Flask-WTF does the rest for you.

所以在你的配置文件中,你应该设置 key

import os

class Config(object):
SECRET_KEY = os.environ.get('SECRET_KEY') or 'you-will-never-guess'

如果这不起作用,请在您的 login.html 中尝试在表单的开头添加 csrf_token,如下所示:

<form action="" method="post">
{{ form.csrf_token }}
<div class="form-group">
<label class="col-sm-12" for="username">
{{ form.username.label }}
.....

关于python-3.x - flask_wtf.csrf CSRF token 不匹配 - 无法修复 flask 错误消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53178077/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com