Flask SQLAlchemy 和 Flask-Security-too

问题描述

我也遇到了 Flask-SecuritysqlAlchemy 的问题。在下面的示例中,我可以创建一个用户,一旦创建了用户,我就想创建具有一对多关系的线程。当我将用户对象传递给查询时,收到以下错误消息;

sqlalchemy.exc.InterfaceError: (sqlite3.InterfaceError) 错误绑定 参数 1 - 可能不受支持的类型。 [sql:插入线程 (title,user_id) VALUES (?,?)] [参数: ('NewThread',)] (此错误的背景:https://sqlalche.me/e/14/rvf5

import os
from flask import Flask
from flask_sqlalchemy import sqlAlchemy
from flask_security import sqlAlchemyUserDatastore,Security

db = sqlAlchemy()
security = Security()


def create_app():
    app = Flask(__name__)
    db.init_app(app)
    app.config['SECRET_KEY'] = 'secretkey__'
    app.config['Security_PASSWORD_SALT'] = 'secretsalt__'
    app.config['sqlALCHEMY_DATABASE_URI'] = 'sqlite:///database.db'
    app.config['sqlALCHEMY_TRACK_MODIFICATIONS'] = False

class RolesUsers(db.Model):
    id = db.Column(db.Integer(),primary_key=True)
    user_id = db.Column('user_id',db.Integer(),db.ForeignKey('user.id'))
    role_id = db.Column('role_id',db.ForeignKey('role.id'))

class User(db.Model):
    id = db.Column(db.Integer,primary_key=True)
    username = db.Column(db.String(255),unique=True,nullable=True)
    active = db.Column(db.Boolean())
    fs_uniquifier = db.Column(db.String(255),nullable=False)
    roles = db.relationship(
        'Role',secondary='roles_users',backref=db.backref('users',lazy='dynamic'))
    threads = db.relationship('Thread',backref='author',lazy=True)

class Role(db.Model):
    id = db.Column(db.Integer(),primary_key=True)
    name = db.Column(db.String(80),unique=True)

class Thread(db.Model):
    id = db.Column(db.Integer,primary_key=True)
    title = db.Column(db.String(50),nullable=False)
    user_id = db.Column(db.Integer,db.ForeignKey('user.id'))

user_datastore = sqlAlchemyUserDatastore(db,User,Role)
security.init_app(app,user_datastore)

# Create user works as expected
@app.route('/user/<string:username>')
def create_user(username):
    new_user = user_datastore.create_user(username=username)
    db.session.add(new_user)
    db.session.commit()
    print(new_user)

# When trying to create a thread record using the user object I receive an error message,when entering the integer of the user ID the record is successfully created
@app.route('/thread/<string:post>')


 def create_thread(post):
        user = User.query.filter_by(id=1).first()
        new_thread = Thread(title=post,user_id=user)
        db.session.add(new_thread)
        db.session.commit()
        print(new_thread)

    create_databse(app)
    return app


def create_databse(app):
    if os.path.isfile('database.db'):
        print('Database already created.')
    else:
        db.create_all(app=app)
        print('Database created.')


if __name__ == '__main__':
    app = create_app()
    app.run(debug=True)

要求.txt

autopep8==1.5.7
blinker==1.4
click==8.0.1
colorama==0.4.4
dnspython==2.1.0
email-validator==1.1.3
Flask==2.0.1
Flask-Login==0.5.0
Flask-Principal==0.4.0
Flask-Security-Too==4.1.0
Flask-sqlAlchemy==2.5.1
Flask-WTF==0.15.1
greenlet==1.1.0
idna==3.2
itsdangerous==2.0.1
Jinja2==3.0.1
MarkupSafe==2.0.1
passlib==1.7.4
pycodestyle==2.7.0
sqlAlchemy==1.4.22
toml==0.10.2
Werkzeug==2.0.1
WTForms==2.3.3

TIA

解决方法

您必须将用户 ID 放入 user_id 而不是用户对象

new_thread = Thread(title=post,user_id=user.id)

还有一个。您忘记在 Flask Security 的快速入门指南中将 fsqla.FsRoleMixin 和 fsqla.FsUserMixin 添加到您的模型角色和用户的父级 https://flask-security-too.readthedocs.io/en/stable/quickstart.html#basic-sqlalchemy-application

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...