1

Я только что начал делать флягу restful api и пытаюсь зарегистрировать пользователя, отправив запрос POST на localhost:5000/api/v1/users. Обязательные поля - это адрес электронной почты и пароль. Вот завиток запрос на создание пользователя curl http://localhost:5000/api/v1/users -d "[email protected]&password=password" -X POST -vflask wtforms_alchemy объект не имеет атрибута

Но он возвращает мне эту ошибку: 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 (Я устал размещать t он 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? Я вообще не понимаю, как это работает, чтобы автоматически создавать форму с моделей.

ответ

2

UserCreateForm наследует свои поля из столбцов, которые вы определяете на User. User не имеет колонки с именем password, поэтому UserCreateForm не имеет такого поля. Вам нужно будет добавить поле самостоятельно.

from wtforms.fields import PasswordField 

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

    password = PasswordField() 

WTForms-Alchemy docs говорить о добавлении и переопределении полей.

+0

Что делать, если я хочу другое имя, например 'fname' в столбце базы данных, и я хочу добавить поля' firstname' в форму. Если я делаю 'firstname = TextField()' будет ли значение из этого поля передаваться в столбец 'fname' в моей базе данных? – Ricek

+0

Не обошлось без вас. WTForms-Alchemy может устанавливать соединения только при совпадении имен. Если вам нужно сделать какое-либо настраиваемое сопоставление, вам нужно включить его сами. В идеале вы бы не дали ему имя в модели и другое имя в форме. Но в случае пароля вы можете реализовать свой собственный 'populate_obj' и включить' obj.password = self.password.data' или что-то в этом направлении. – dirn

+0

Теперь пароль работает, но мне любопытно, как это сделать. У вас есть пароль в поле формы, но в столбце db это 'password_hash', и, как вы упомянули, нет сопоставления. – Ricek

 Смежные вопросы

  • Нет связанных вопросов^_^