Я только что начал делать флягу restful api и пытаюсь зарегистрировать пользователя, отправив запрос POST на localhost:5000/api/v1/users
. Обязательные поля - это адрес электронной почты и пароль. Вот завиток запрос на создание пользователя curl http://localhost:5000/api/v1/users -d "[email protected]&password=password" -X POST -v
flask 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? Я вообще не понимаю, как это работает, чтобы автоматически создавать форму с моделей.
Что делать, если я хочу другое имя, например 'fname' в столбце базы данных, и я хочу добавить поля' firstname' в форму. Если я делаю 'firstname = TextField()' будет ли значение из этого поля передаваться в столбец 'fname' в моей базе данных? – Ricek
Не обошлось без вас. WTForms-Alchemy может устанавливать соединения только при совпадении имен. Если вам нужно сделать какое-либо настраиваемое сопоставление, вам нужно включить его сами. В идеале вы бы не дали ему имя в модели и другое имя в форме. Но в случае пароля вы можете реализовать свой собственный 'populate_obj' и включить' obj.password = self.password.data' или что-то в этом направлении. – dirn
Теперь пароль работает, но мне любопытно, как это сделать. У вас есть пароль в поле формы, но в столбце db это 'password_hash', и, как вы упомянули, нет сопоставления. – Ricek