Flask-在Flask-SQLAlchemy中的'BaseQuery'和'int'实例之间不支持TypeError:'>'

时间:2018-10-28 18:33:58

标签: python sqlalchemy

所以我试图创建一个“登录”系统,引号是因为永远没有安全性。

我当前的代码如下:

@app.route('/login', methods=['GET', 'POST'])
def login():
    if request.method == 'POST':
        if not request.form['user'] or not request.form['password']:
            flash('Please enter all the fields', 'error')
        else:
            username = request.form['user']
            password = request.form['password']

            exists = db.session.query(User.user).filter_by(
                user=username)
            if exists > 0:
                logged_in = True
                session['username'] = username
                session['logged_in'] = True
                return index(exists=exists)
            return render_template('login.html', exists=exists)
        return render_template('login.html')
    return render_template('login.html')

但是,我得到了错误:

TypeError: '>' not supported between instances of 'BaseQuery' and 'int'

我不明白,因为exists应该返回整数。

任何帮助都会很棒,谢谢!

1 个答案:

答案 0 :(得分:1)

exists = db.session.query(User.user).filter_by(user=username)是一个BaseQuery对象,当您打印时它会返回SQL查询。您正在尝试比较BasQuery实例和int从而导致错误。

>>> exists = db.session.query(User).filter_by(username='me')
>>> exists
<flask_sqlalchemy.BaseQuery object at 0x7fbbb7812b70>
>>> type(exists)
<class 'flask_sqlalchemy.BaseQuery'>
>>> type(0)
<class 'int'>
>>> print(exists)
SELECT user.username AS user_username 
FROM user 
WHERE user.username = ?

如果要检查exists是否大于零,则应在查询末尾添加.all(),然后使用len(exists),因为它返回一个列表。

>>> exists = db.session.query(User).filter_by(username='me').all()
>>> exists
[<User 1>]
>>> len(exists)
1
>>> type(len(exists))
<class 'int'>