使用 SQLAlchemy 的 hybrid_property 时,Flask 找不到 'password' 字段
Flask can't find 'password' field when using SQLAlchemy's hybrid_property
我正在学习 Flask,并且正在试用 exploreflask tutorial。我的注册表不起作用。错误在 server.py 中并表示:
password = form.password.data
TypeError: __init__() got an unexpected keyword argument 'password'
我正在使用 Flask-SQLAlchemy 的 declarative_base
,所以我相信密码上的 hybrid_property
应该可以正常工作,但事实并非如此!
models.py:
from flask.ext.login import UserMixin
from flask.ext.bcrypt import Bcrypt
from sqlalchemy.ext.hybrid import hybrid_property
from sqlalchemy import Column, Integer, String
from database import Base
# Base is using Flask-SqlAlchemy's declarative_base()
class User(Base, UserMixin):
__tablename__ = 'users'
id = Column(Integer, primary_key=True)
email = Column(String(120), unique=True)
_password = Column(String(120))
def __init__(self, name=None, email=None):
self.email = email
def __repr__(self):
return '<User %r>' % (self.name)
@hybrid_property
def password(self):
return self._password
@password.setter
def _set_password(self, plaintext):
self._password = bcrypt.generate_password_hash(plaintext)
def verify_password(self, plaintext):
return bcrypt.check_password_hash(self._password, plaintext)
forms.py:
from flask_wtf import Form
from wtforms import StringField, PasswordField
from wtforms.fields.html5 import EmailField
from wtforms.validators import InputRequired
class RegisterForm(Form):
email = EmailField('email', validators=[InputRequired()])
password = PasswordField('password', validators=[InputRequired()])
server.py:
@app.route('/register', methods=["GET", "POST"])
def register():
form = RegisterForm()
if form.validate_on_submit():
user = User(
email = form.email.data,
password = form.password.data
)
db_session.add(user)
db_session.commit()
return redirect(url_for('login.html'))
return render_template('register.html', form=form)
我不确定哪里出了问题?
在 server.py 中,您正在使用电子邮件和密码初始化用户实例。
但是,User class 的构造函数只接受参数名称和电子邮件。
所以你应该改变你的构造函数,让它也接受密码。
def __init__(self, name=None, email=None, password=None)
#your constructor logic
我正在学习 Flask,并且正在试用 exploreflask tutorial。我的注册表不起作用。错误在 server.py 中并表示:
password = form.password.data
TypeError: __init__() got an unexpected keyword argument 'password'
我正在使用 Flask-SQLAlchemy 的 declarative_base
,所以我相信密码上的 hybrid_property
应该可以正常工作,但事实并非如此!
models.py:
from flask.ext.login import UserMixin
from flask.ext.bcrypt import Bcrypt
from sqlalchemy.ext.hybrid import hybrid_property
from sqlalchemy import Column, Integer, String
from database import Base
# Base is using Flask-SqlAlchemy's declarative_base()
class User(Base, UserMixin):
__tablename__ = 'users'
id = Column(Integer, primary_key=True)
email = Column(String(120), unique=True)
_password = Column(String(120))
def __init__(self, name=None, email=None):
self.email = email
def __repr__(self):
return '<User %r>' % (self.name)
@hybrid_property
def password(self):
return self._password
@password.setter
def _set_password(self, plaintext):
self._password = bcrypt.generate_password_hash(plaintext)
def verify_password(self, plaintext):
return bcrypt.check_password_hash(self._password, plaintext)
forms.py:
from flask_wtf import Form
from wtforms import StringField, PasswordField
from wtforms.fields.html5 import EmailField
from wtforms.validators import InputRequired
class RegisterForm(Form):
email = EmailField('email', validators=[InputRequired()])
password = PasswordField('password', validators=[InputRequired()])
server.py:
@app.route('/register', methods=["GET", "POST"])
def register():
form = RegisterForm()
if form.validate_on_submit():
user = User(
email = form.email.data,
password = form.password.data
)
db_session.add(user)
db_session.commit()
return redirect(url_for('login.html'))
return render_template('register.html', form=form)
我不确定哪里出了问题?
在 server.py 中,您正在使用电子邮件和密码初始化用户实例。 但是,User class 的构造函数只接受参数名称和电子邮件。
所以你应该改变你的构造函数,让它也接受密码。
def __init__(self, name=None, email=None, password=None)
#your constructor logic