在运行我们的服务器时,我们遇到了一个奇怪的问题,该问题使用了SQLALCHEMIY和flaskSecurity
SQL:INSERT USER(EMAIL,USERNAME,PASSWORD,ACTIVE,SUPER_SAAS_ADMIN,FS_UNIQUIZER,CONFERIFIED_AT,TF_PHONE_NUMBER,TF_PRIMARY_METHOD,TF_TOTP_SECRET)Values(?,?)][参数:(‘test@me.com’,None,‘Password’,1,None,None)]
有谁知道这是什么原因造成的吗?
import os
from flask import Flask, render_template_string
from flask_sqlalchemy import SQLAlchemy
from flask_security import Security, SQLAlchemyUserDatastore, auth_required, RoleMixin, UserMixin
from flask_security.models import fsqla_v2 as fsqla
# Create app
app = Flask(__name__)
app.config['DEBUG'] = True
# Generate a nice key using secrets.token_urlsafe()
app.config['SECRET_KEY'] = os.environ.get("SECRET_KEY", 'xxxxx')
# Bcrypt is set as default SECURITY_PASSWORD_HASH, which requires a salt
# Generate a good salt using: secrets.SystemRandom().getrandbits(128)
app.config['SECURITY_PASSWORD_SALT'] = os.environ.get("SECURITY_PASSWORD_SALT", 'xxxxxx')
# Use an in-memory db
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///database.db'
# As of Flask-SQLAlchemy 2.4.0 it is easy to pass in options directly to the
# underlying engine. This option makes sure that DB connections from the
# pool are still valid. Important for entire application since
# many DBaaS options automatically close idle connections.
app.config["SQLALCHEMY_ENGINE_OPTIONS"] = {
"pool_pre_ping": True,
}
app.config["SQLALCHEMY_TRACK_MODIFICATIONS"] = False
# Create database connection object
db = SQLAlchemy(app)
# Define models
fsqla.FsModels.set_db_info(db)
# Define models
roles_users = db.Table('roles_users_2',
db.Column('user_id', db.Integer(), db.ForeignKey('user.id')),
db.Column('role_id', db.Integer(), db.ForeignKey('role.id')))
class Role(db.Model, RoleMixin):
id = db.Column(db.Integer(), primary_key=True)
name = db.Column(db.String(80), unique=True)
description = db.Column(db.String(255))
class User(db.Model, UserMixin):
id = db.Column(db.Integer, primary_key=True)
email = db.Column(db.String(255), unique=True)
# Make username unique but not required.
username = db.Column(db.String(255), unique=True, nullable=True)
password = db.Column(db.String(255))
active = db.Column(db.Boolean())
super_saas_admin = db.Column(db.Boolean)
roles = db.relationship('Role', secondary=roles_users, backref=db.backref('users', lazy='dynamic'))
fs_uniquifier = db.Column(db.String(255), unique=True, nullable=False)
confirmed_at = db.Column(db.DateTime())
tf_phone_number = db.Column(db.String(128), nullable=True)
tf_primary_method = db.Column(db.String(64), nullable=True)
tf_totp_secret = db.Column(db.String(255), nullable=True)
# Setup Flask-Security
user_datastore = SQLAlchemyUserDatastore(db, User, Role)
security = Security(app, user_datastore)
# Create a user to test with
@app.before_first_request
def create_user():
db.create_all()
if not user_datastore.find_user(email="test@me.com"):
user_datastore.create_user(email="test@me.com", password="password")
db.session.commit()
# Views
@app.route("/")
@auth_required()
def home():
return render_template_string("Hello {{ current_user.email }}")
if __name__ == '__main__':
app.run()
2条答案
按热度按时间x6h2sr281#
这就是我认为*可能发生的事情--你使用的是FlaskSecurity附带的FSQLA模型--然而你也完全定义了自己的用户模型--我猜有两个用户模型在运行,系统变得混乱了。你应该尝试的是:
就是这样。
bq8i3lrv2#
这在我的PyCharm中正在发生。我假设你有一个包含你的应用程序的模块,以及一个在模块外部运行它的文件。
有两个选项对我都有效:
1.将运行应用程序的文件移到模块中。我将它移到了模块中的
app.py
中,但我知道在某些环境中这可能会导致问题。1.使用
python <file>.py
从终端选项卡运行该文件。这需要你进入应用程序的虚拟环境(如果你已经创建了一个)。