我是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')
有谁知道为什么我无法访问用户的密码列,或者实际上没有任何列?我已经尝试了数据库中的所有3个,ID,用户名和密码。
参考方案
@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()
会执行查询,而不是存储Query对象
它只会返回第一个结果。
.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对象,而不是存储的查询。您不能从查询对象访问用户对象属性(密码)
flask sqlalchemy-根据数据库中的列动态生成数据模型 - python有没有一种方法可以根据Flask SQLAlchemy的数据库表中的列动态生成数据库模型?我有一个应用程序来显示数据库表中的数据,但是列名有时会更改并破坏我的应用程序。我希望有一种方法可以根据数据库中的实际列名动态生成数据模型。我目前明确声明所有列,如下所示。class MyDbModel(db.Model): __tablename__ = '…
Flask_SQLAlchemy无法像SQLAlchemy那样反映数据库 - python我正在尝试使用python-Flask将Foreigner Database连接到Flask_SQLALchemy应用我到处都看过,包括FLASK_SQLALCHEMY official doc 过去4天里,我一直在Internet上到处寻找FLASK_SQLALCHEMY中没有ORM库的任何教程,但运气不佳我一直在查看SQLAlchemy Reflecti…
SQLalchemy数据库列应采用哪种模型来包含数据数组? - python因此,我正在尝试建立一个数据库,该数据库的行将经常修改。例如,每小时,我想向数据库的特定部分添加一个数字。因此,如果将self.checkmarks输入等于3的数据库,最好的方法是用增加的数字更新数据库的此部分以使self.checkmarks现在等于3, 2?我尝试将列建立为db.Array,但出现属性错误: AttributeError:“ SQLAlc…
插入带有复合主键的模型时发生IntegrityError - python我试图用复合主键创建一个表。它具有一个整数和两个字符串字段作为键。当我提交会话时,它会引发一个IntegrityError。我在做什么错了?class Targets(db.Model): __tablename__ = 'Targets' id = db.Column(db.Integer, primary_key=True) Even…
Flask-RESTful-返回自定义响应格式 - python我已经按照以下Flask-RESTful文档定义了自定义响应格式。app = Flask(__name__) api = restful.Api(app) @api.representation('application/octet-stream') def binary(data, code, headers=None): resp =…