Flask + sqlalchemy получают объект класса из базы данных
Я создаю приложение Flask
, используя SqlAlchemy
, и я хотел бы получить hashed_password
, используя db_session.query
.
вот моя модель пользователя:
import sqlalchemy
from flask_login import UserMixin
from werkzeug.security import generate_password_hash, check_password_hash
from .db_session import SqlAlchemyBase
class User(SqlAlchemyBase, UserMixin):
__tablename__ = 'users'
id = sqlalchemy.Column(sqlalchemy.Integer,
primary_key=True, autoincrement=True)
name = sqlalchemy.Column(sqlalchemy.String, nullable=True)
surname = sqlalchemy.Column(sqlalchemy.String, nullable=True)
age = sqlalchemy.Column(sqlalchemy.Integer, nullable=True)
position = sqlalchemy.Column(sqlalchemy.String, nullable=True)
speciality = sqlalchemy.Column(sqlalchemy.String, nullable=True)
address = sqlalchemy.Column(sqlalchemy.String, nullable=True)
email = sqlalchemy.Column(sqlalchemy.String,
index=True, nullable=True)
def set_password(self, password):
self.hashed_password = generate_password_hash(password)
def check_password(self, password):
return check_password_hash(self.hashed_password, password)
Вы видите, что здесь нет столбца password
, но я добавляю user.hashed_password
в set_password
func
Вот регистр app.route:
@app.route('/register', methods=['GET', 'POST'])
def reqister():
form = RegisterForm()
if form.validate_on_submit():
if form.password.data != form.password_again.data:
return flask.render_template('register.html', title='Регистрация',
form=form,
message="Пароли не совпадают")
db_sess = db_session.create_session()
if db_sess.query(User).filter(User.email == form.email.data).first():
return flask.render_template('register.html', title='Регистрация',
form=form,
message="Такой пользователь уже есть")
user = User(
name=form.name.data,
email=form.email.data,
surname=form.surname.data,
age=form.age.data,
position=form.position.data,
speciality=form.speciality.data,
address=form.address.data
)
user.set_password(form.password.data)
db_sess.add(user)
db_sess.commit()
return flask.redirect('/login')
return flask.render_template('register.html', title='Регистрация', form=form)
Я вызываю user.set_password
в нижней части функции и пытаюсь проверить пароль здесь:
@app.route('/login', methods=['GET', 'POST'])
def login():
form = LoginForm()
if form.validate_on_submit():
db_sess = db_session.create_session()
user = db_sess.query(User).filter(User.email == form.email.data).first()
if user and user.check_password(form.password.data):
flask_login.login_user(user, remember=form.remember_me.data)
return flask.redirect("/")
return flask.render_template('login.html',
message="Неправильный логин или пароль",
form=form)
return flask.render_template('login.html', title='Авторизация', form=form)
Я пытаюсь войти в систему и получаю эту ошибку:
127.0.0.1 - - [18/Mar/2022 20:13:34] "POST /login HTTP/1.1" 500 -
Traceback (most recent call last):
File "D:\programming\studyrepo\Yandex\yandex_venv\Lib\site-packages\flask\app.py", line 2091, in __call__
return self.wsgi_app(environ, start_response)
File "D:\programming\studyrepo\Yandex\yandex_venv\Lib\site-packages\flask\app.py", line 2076, in wsgi_app
response = self.handle_exception(e)
File "D:\programming\studyrepo\Yandex\yandex_venv\Lib\site-packages\flask\app.py", line 2073, in wsgi_app
response = self.full_dispatch_request()
File "D:\programming\studyrepo\Yandex\yandex_venv\Lib\site-packages\flask\app.py", line 1518, in full_dispatch_request
rv = self.handle_user_exception(e)
File "D:\programming\studyrepo\Yandex\yandex_venv\Lib\site-packages\flask\app.py", line 1516, in full_dispatch_request
rv = self.dispatch_request()
File "D:\programming\studyrepo\Yandex\yandex_venv\Lib\site-packages\flask\app.py", line 1502, in dispatch_request
return self.ensure_sync(self.view_functions[rule.endpoint])(**req.view_args)
File "D:\programming\studyrepo\Yandex\flask\main.py", line 86, in login
if user and user.check_password(form.password.data):
File "D:\programming\studyrepo\Yandex\flask\data\users.py", line 27, in check_password
return check_password_hash(self.hashed_password, password)
AttributeError: 'User' object has no attribute 'hashed_password'
Что я делаю не так?