首页 > 解决方案 > 如何通过烧瓶检查 db sqlite 中的布尔值是否为真

问题描述

我正在用 python 在烧瓶中写一个小网站。这对我来说是全新的,但我已经弄清楚如何创建站点、路由、管理员登录、注册表单等。

现在我想检查并记住登录后您是否是管理员。我正在考虑通过我的 sqlite 数据库中的布尔值来解决这个问题。但我没有检查布尔值是真还是假。

可能这不是最好的方法,如果是这样,请指出我正确的方向。而且,尽管如此,了解如何检查我的数据库中的布尔值对我来说是一件有趣的事情。

对于我拥有的数据库;

class User(UserMixin, db.Model):
    id = db.Column(db.Integer, primary_key=True)
    username = db.Column(db.String(15), unique=True)
    email = db.Column(db.String(50), unique=True)
    password = db.Column(db.String(80))
    admin = db.Column(db.Boolean, default=False)

在数据库中,这转化为;

sqlite> select * from user;
1|admin|test@test.com|sha256$c2GxyyGc$d4df5929026fa62e49a587a8275ed4c
0abfb45e6d35d3617146e7326c13367e1|1
2|user|user@test.com|sha256$9y9Pz2PY$d2445b365d98a55e041d32c9781fba22f4a9e7db72c
f4c490e3ac1b3d3a3ffd4|0
sqlite>

最后一个值是“管理值”

检查登录名,以及您是否是管理员

@app.route('/login', methods= ['GET', 'POST'])
def login():
    form = LoginForm()
    if form.validate_on_submit():
           user = User.query.filter_by(username=form.username.data).first()
           if user:
               if check_password_hash(user.password, form.password.data):
                   login_user(user, remember=form.remember.data)
                   adm = User.query.filter(User.admin.is_(True)).first()
                   if adm == True:
                       return redirect(url_for('dashboard'))
                   return redirect(url_for('index'))
           return '<h1>Invalid username or password</h1>'
    return render_template('login.html', form = form)

我希望去仪表板,但我被重定向到索引页面。如果我返回 adm 的值,我会收到此错误:

TypeError:视图函数没有返回有效响应。返回类型必须是字符串、字典、元组、响应实例或 WSGI 可调用,但它是用户。

我明白这显然是一个强烈的暗示,但我无法正确理解。

标签: pythonsqliteflaskboolean

解决方案


该语句
user = User.query.filter_by(username=form.username.data).first()
应该已经返回一条User记录,
因此进一步查询adm = User.query.filter(User.admin.is_(True)).first()没有意义。在提取的记录上检查所需的属性,User如下所示:

...
if form.validate_on_submit():
       user = User.query.filter_by(username=form.username.data).first()
       if user:
           if check_password_hash(user.password, form.password.data):
               login_user(user, remember=form.remember.data)
               if user.admin:
                   return redirect(url_for('dashboard'))
               return redirect(url_for('index'))
       return '<h1>Invalid username or password</h1>'
return render_template('login.html', form = form)

推荐阅读