flask wtforms_alchemy 对象没有属性

flask wtforms_alchemy object has no attribute

我刚开始做 flask restful api 并尝试通过向 localhost:5000/api/v1/users 发送 POST 请求来注册用户。必填字段是电子邮件和密码。这是创建用户 curl http://localhost:5000/api/v1/users -d "email=admin@example.com&password=password" -X POST -v

的 curl 请求

但是 returns 我这个错误:AttributeError: 'UserCreateForm' object has no attribute 'password'

下面是我的代码片段

views.py

class UserView(restful.Resource):
    def post(self):
        form = UserCreateForm()
        if not form.validate_on_submit():
            return form.errors, 422

        user = User(email=form.email.data, password=form.password.data)
        db.session.add(user)
        db.session.commit()
        return UserSerializer(user).data

forms.py

BaseModelForm = model_form_factory(Form)

class ModelForm(BaseModelForm):
    @classmethod
    def get_session(self):
        return db.session

class UserCreateForm(ModelForm):
    class Meta:
        model = User

models.py(我厌倦了将 UserMixin 放在第二位,仍然出现同样的错误)

class User(db.Model, UserMixin):
    __tablename__ = 'users'
    id = db.Column(db.Integer, primary_key=True)
    email = db.Column(db.String(64), unique=True, index=True)
    password_hash = db.Column(db.String(128))

    @property
    def password(self):
        raise AttributeError('password is not a readable attribute')

    @password.setter
    def password(self, password):
        self.password_hash = generate_password_hash(password)

    def verify_password(self, password):
        return check_password_hash(self.password_hash, password)

此外,我已经 login_manager.user_loader 包括在内,所以我认为 Flask 登录不会有问题。

是否有 wtform_alchemy 的文档?我完全不明白如何从模型中自动创建表单。

UserCreateForm 将从您在 User 上定义的列继承其字段。 User 没有名为 password 的列,因此 UserCreateForm 没有这样的字段。您必须自己添加该字段。

from wtforms.fields import PasswordField

class UserCreateForm(ModelForm):
    class Meta:
        model = User

    password = PasswordField()

WTForms-Alchemy docs 讨论添加和覆盖字段。