【问题标题】:Flask SQLAlchemy & Flask-Security-tooFlask SQLAlchemy 和 Flask-Security-too
【发布时间】:2021-10-02 07:50:48
【问题描述】:

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

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.Integer(), 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), unique=True, 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)

requirements.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

【问题讨论】:

    标签: python flask flask-sqlalchemy flask-security


    【解决方案1】:

    您必须将用户 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

    【讨论】:

      猜你喜欢
      • 2020-12-19
      • 2015-03-25
      • 2017-05-28
      • 2013-06-23
      • 2014-01-28
      • 2016-04-22
      • 2019-07-13
      • 1970-01-01
      • 2018-02-08
      相关资源
      最近更新 更多