- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我是 Python 和 Flask 新手。
我正在关注本教程 http://douglasstarnes.com/index.php/2015/05/27/easy-authentication-with-flask-login/拥有注册和登录页面,并对其进行了稍微修改,以在注册时对密码进行哈希处理,并根据登录时的哈希值验证密码。
初始密码注册哈希有效,但根据通过登录表单以纯文本形式给出的密码验证存储在数据库中的哈希密码则无效。
我收到的错误是针对/login 页面上的以下行,原因如下:
if user.count() == 1 and check_password_hash(user.password, password) == True:
AttributeError: 'BaseQuery' object has no attribute 'password'
我无法弄清楚为什么会收到此错误。成功从数据库查询用户,并且用户在密码列中拥有其哈希密码。
我正在使用的查询和从密码列返回数据的方法与文档 http://flask-sqlalchemy.pocoo.org/2.1/queries/#querying-records 中包含的类似。
这是我的views.py(/login 和错误行位于底部)
from flask import Flask, render_template, request, abort, redirect, url_for, flash
from flask.ext.login import LoginManager, UserMixin, login_user, logout_user, login_required
from flask.ext.sqlalchemy import SQLAlchemy
from werkzeug.security import generate_password_hash, check_password_hash
from app import app
import os
login_manager = LoginManager(app)
login_manager.init_app(app)
login_manager.login_view = 'login'
login_manager.session_protection = "strong"
db = SQLAlchemy(app)
class User(db.Model, UserMixin):
id = db.Column(db.Integer, primary_key=True)
username = db.Column(db.String)
password = db.Column(db.String)
@login_manager.user_loader
def user_loader(user_id):
user = User.query.filter_by(id=user_id)
if user.count() == 1:
return user.one()
return None
@app.before_first_request
def init_request():
db.create_all()
@app.route('/secret')
@login_required
def secret():
return render_template('secret.html')
@app.route('/logout')
def logout():
logout_user()
return redirect(url_for('index'))
@app.route('/register', methods=['GET', 'POST'])
def register():
if request.method == 'GET':
return render_template('register.html')
elif request.method == 'POST':
username = request.form['txtUsername']
password = request.form['txtPassword']
user = User.query.filter_by(username=username)
if user.count() == 0:
hashed_password = generate_password_hash(password)
user = User(username=username, password=hashed_password)
db.session.add(user)
db.session.commit()
flash('You have registered the username {0}. Please login'.format(username))
return redirect(url_for('login'))
else:
flash('The username {0} is already in use. Please try a new username.'.format(username))
return redirect(url_for('register'))
else:
abort(405)
@app.route('/login', methods=['GET', 'POST'])
def login():
if request.method == 'GET':
return render_template('login.html', next=request.args.get('next'))
elif request.method == 'POST':
username = request.form['txtUsername']
password = request.form['txtPassword']
user = User.query.filter_by(username=username)
if user.count() == 1 and check_password_hash(user.password, password) == True:
login_user(user.one(), remember=True)
flash('Welcome back {0}'.format(username))
try:
next = request.form['next']
return redirect(next)
except:
return redirect(url_for('index'))
else:
flash('Invalid login')
return redirect(url_for('login'))
else:
return abort(405)
@app.route('/')
def index():
return render_template('index.html')
有谁知道为什么我无法访问用户的密码列,或者事实上任何列?我已经尝试了数据库、ID、用户名和密码中的所有 3 个。
最佳答案
@login_manager.user_loader
def user_loader(user_id):
user = User.query.filter_by(id=user_id).first()
if user:
return user
return None
应用.first()
执行查询,而不是存储查询对象它只会返回第一个结果。
.all()
返回全部
编辑:
或者你可以使用user = User.query.get(user_id)
假设user_id
被定义为PK
在您的登录功能中,它应该是
user = User.query.filter_by(username=username).first()
if user and check_password_hash(user.password, password) == True:
login_user(user)
现在用户引用真实的 User 对象,而不是存储的查询。您无法从查询对象访问用户对象属性(密码)
关于python - Flask-sqlalchemy - 用户查询 'BaseQuery' 对象没有属性 'password',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34795798/
我正在使用 SQLalchemy 并将数据输入数据库: class Directions(db.Model): id = db.Column(db.Integer, primary_key=T
我正在使用 Flask (python),创建 whooshe 搜索,我已遵循此 link 中的所有步骤,也从其他链接尝试过,但每次最后我都会遇到这个错误: results = BlogPost.qu
这个问题在这里已经有了答案: Querying with function on Flask-SQLAlchemy model gives BaseQuery object is not calla
我是 Python 和 Flask 新手。 我正在关注本教程 http://douglasstarnes.com/index.php/2015/05/27/easy-authentication-wi
这个问题是“Filter relationships and paginate in Flask-SQLAlchemy”的简化,这里的答案可能也会在那里产生解决方案。 假设我有一个简单的模型类设计:
我的 flask 代码中有两行进行数据库调用。这一行: articles += Entries.query.filter(and_(Entries.id == article.article_id,
这个问题在这里已经有了答案: Querying with function on Flask-SQLAlchemy model gives BaseQuery object is not calla
我想查询两个日期之间的服务并对它们的价格求和。当我尝试将 func.sum 与 Services.query 一起使用时,我得到了 TypeError: BaseQuery object is not
我是一名优秀的程序员,十分优秀!