首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >酒瓶SQLAlchemy &酒瓶--太安全了

酒瓶SQLAlchemy &酒瓶--太安全了
EN

Stack Overflow用户
提问于 2021-07-26 11:05:14
回答 1查看 1.1K关注 0票数 0

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

sqlalchemy.exc.InterfaceError:(sqlite3.InterfaceError)错误绑定参数1--可能不支持类型。SQL:插入线程(title,user_id)值(?,?)(有关此错误的背景信息:https://sqlalche.me/e/14/rvf5)

代码语言:javascript
运行
复制
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

代码语言:javascript
运行
复制
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

提亚

EN

回答 1

Stack Overflow用户

发布于 2021-07-28 09:36:08

必须将用户id放在user_id中而不是用户对象中。

代码语言:javascript
运行
复制
new_thread = Thread(title=post, user_id=user.id)

再来一个。您忘了将fsqla.FsRoleMixin和fsqla.FsUserMixin添加到您的父母、角色和用户中,比如在https://flask-security-too.readthedocs.io/en/stable/quickstart.html#basic-sqlalchemy-application的快速启动指南中

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68528753

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档