1

フラスコ安静APIの実行を開始し、にPOSTリクエストを送信してユーザーを登録しようとしましたlocalhost:5000/api/v1/users。必須フィールドは電子メールとパスワードです。ユーザーを作成するためのcurlリクエストは次のとおりですcurl http://localhost:5000/api/v1/users -d "email=admin@example.com&password=password" -X POST -v

しかし、それは私にこのエラーを返します:AttributeError: 'UserCreateForm' object has no attribute 'password'

以下は私のコードの一部です

ビュー.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

フォーム.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 ( to を 2 番目に配置するのに疲れましたが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含めたので、フラスコログインでは問題ないと思います。

wtform_alchemy のドキュメントはありますか? モデルから自動的にフォームを作成する方法がまったくわかりません。

4

1 に答える 1

2

UserCreateFormは、 で定義した列からフィールドを継承しますUserUserには という名前の列がないpasswordため、そのUserCreateFormようなフィールドはありません。自分でフィールドを追加する必要があります。

from wtforms.fields import PasswordField

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

    password = PasswordField()

WTForms-Alchemy のドキュメントでは、フィールドの追加とオーバーライドについて説明しています。

于 2015-02-13T04:23:19.243 に答える