Flask AttributeError: 'LoginForm' object has no attribute 'userEmail'
Flask AttributeError: 'LoginForm' object has no attribute 'userEmail'
我一直在创建一个基于论坛的学习系统,类似于评估项目的堆栈溢出。我是 Flask 的新手,但我相信我对 python 有一定的了解。我一直在关注 Corey Schafer's Flask 教程并根据我的项目调整它们。每当我尝试使用数据库中现有的用户名和密码登录我的系统时,我都会收到错误消息:
"AttributeError: 'LoginForm' object has no attribute 'userEmail'".
回溯:
Traceback (most recent call last):
File "C:\Users\jmb13\AppData\Roaming\Python\Python37\site-packages\flask\app.py", line 2309, in __call__
return self.wsgi_app(environ, start_response)
File "C:\Users\jmb13\AppData\Roaming\Python\Python37\site-packages\flask\app.py", line 2295, in wsgi_app
response = self.handle_exception(e)
File "C:\Users\jmb13\AppData\Roaming\Python\Python37\site-packages\flask\app.py", line 1741, in handle_exception
reraise(exc_type, exc_value, tb)
File "C:\Users\jmb13\AppData\Roaming\Python\Python37\site-packages\flask\_compat.py", line 35, in reraise
raise value
File "C:\Users\jmb13\AppData\Roaming\Python\Python37\site-packages\flask\app.py", line 2292, in wsgi_app
response = self.full_dispatch_request()
File "C:\Users\jmb13\AppData\Roaming\Python\Python37\site-packages\flask\app.py", line 1815, in full_dispatch_request
rv = self.handle_user_exception(e)
File "C:\Users\jmb13\AppData\Roaming\Python\Python37\site-packages\flask\app.py", line 1718, in handle_user_exception
reraise(exc_type, exc_value, tb)
File "C:\Users\jmb13\AppData\Roaming\Python\Python37\site-packages\flask\_compat.py", line 35, in reraise
raise value
File "C:\Users\jmb13\AppData\Roaming\Python\Python37\site-packages\flask\app.py", line 1813, in full_dispatch_request
rv = self.dispatch_request()
File "C:\Users\jmb13\AppData\Roaming\Python\Python37\site-packages\flask\app.py", line 1799, in dispatch_request
return self.view_functions[rule.endpoint](**req.view_args)
File "c:\Users\jmb13\OneDrive-A Level Computer Science - Coding Project\Python Files\A-Level-Project\itroom\routes.py", line 17, in login
user = User.query.filter_by(email=form.userEmail.data).first()
AttributeError: 'LoginForm' object has no attribute 'userEmail'
之后用户将被直接重定向到主页。我确定这是我为登录表单创建的 class 的问题。任何帮助表示赞赏。登录表单的代码在 forms.py
中,检查电子邮件和密码的代码在 routes.py
中。当我尝试创建登录时开始出现此错误,并且我更改了 models.py
,我的数据库模型文件。我也为登录页面添加了 HTML,以防那是我的问题所在。
forms.py:
from flask_wtf import FlaskForm
from wtforms import StringField, PasswordField, SubmitField, BooleanField
from wtforms.validators import DataRequired, Length, Email, EqualTo, ValidationError
from itroom.models import User
class LoginForm(FlaskForm):
email = StringField('Email',validators=[DataRequired(), Email()])
password = PasswordField('Password', validators=[DataRequired()])
remember = BooleanField('Remember Me')
submit = SubmitField('Login')
routes.py:
from flask import Flask, render_template, url_for, flash, redirect, request
from itroom import app, db, bcrypt
from itroom.forms import LoginForm, AddUserForm
from itroom.models import User, Post
from flask_login import login_user
@app.route("/login", methods=['GET', 'POST']) #defines the HTML loaded for /login
def login():
form = LoginForm()
if form.validate_on_submit():
user = User.query.filter_by(email=form.userEmail.data).first()
if user and bcrypt.check_password_hash(user.userPassword, form.password.data):
login_user(user, remember=form.remember.data)
return redirect(url_for('home'))
else:
flash('Login Unsucessful, Please check email and password', 'danger')
return render_template('login.html',form=form, title='Login')
models.py
class User(db.Model, UserMixin):
id = db.Column(db.Integer, primary_key=True)
userEmail = db.Column(db.String(120), unique=True, nullable=False)
userPassword = db.Column(db.String(60), nullable=False)
posts = db.relationship('Post', backref='author', lazy=True)
def __repr__(self):
#return f"User('{self.username}', '{self.email}')"
return f"User('User')"
login.html
<body>
<h2 align="center" style="padding: 2.5%;"></h2>
<img src="/static/Logo.png" alt="Logo" class="avatar">
<form method="POST" action="">
{{form.hidden_tag() }}
<div class="form-group">
{{form.email.label}}
{% if form.email.errors %}
{{form.email(size=30, class="form-control is-invalid")}}
<div class="invalid-feedback">
{% for error in form.email.errors %}
<span>{{ error }}</span>
{% endfor %}
</div>
{% else %}
{{form.email(size=30, class="form-control")}}
{% endif %}
</div>
{{form.password.label}} <br>
{{form.password(size=30)}}
{{form.remember}} <br>
{{form.submit(class="btn btn-outline-info")}} <br>
</form>
<div class="container" style="background-color:#f1f1f1">
<span class="psw">Forgot <a href="#">password?</a></span>
</div>
</form>
</div>
</body>
</html>
您需要更改路由中的 SQL 查询,因为变量混淆了。更正后的代码是:
user = User.query.filter_by(userEmail=form.email.data).first()
我一直在创建一个基于论坛的学习系统,类似于评估项目的堆栈溢出。我是 Flask 的新手,但我相信我对 python 有一定的了解。我一直在关注 Corey Schafer's Flask 教程并根据我的项目调整它们。每当我尝试使用数据库中现有的用户名和密码登录我的系统时,我都会收到错误消息:
"AttributeError: 'LoginForm' object has no attribute 'userEmail'".
回溯:
Traceback (most recent call last):
File "C:\Users\jmb13\AppData\Roaming\Python\Python37\site-packages\flask\app.py", line 2309, in __call__
return self.wsgi_app(environ, start_response)
File "C:\Users\jmb13\AppData\Roaming\Python\Python37\site-packages\flask\app.py", line 2295, in wsgi_app
response = self.handle_exception(e)
File "C:\Users\jmb13\AppData\Roaming\Python\Python37\site-packages\flask\app.py", line 1741, in handle_exception
reraise(exc_type, exc_value, tb)
File "C:\Users\jmb13\AppData\Roaming\Python\Python37\site-packages\flask\_compat.py", line 35, in reraise
raise value
File "C:\Users\jmb13\AppData\Roaming\Python\Python37\site-packages\flask\app.py", line 2292, in wsgi_app
response = self.full_dispatch_request()
File "C:\Users\jmb13\AppData\Roaming\Python\Python37\site-packages\flask\app.py", line 1815, in full_dispatch_request
rv = self.handle_user_exception(e)
File "C:\Users\jmb13\AppData\Roaming\Python\Python37\site-packages\flask\app.py", line 1718, in handle_user_exception
reraise(exc_type, exc_value, tb)
File "C:\Users\jmb13\AppData\Roaming\Python\Python37\site-packages\flask\_compat.py", line 35, in reraise
raise value
File "C:\Users\jmb13\AppData\Roaming\Python\Python37\site-packages\flask\app.py", line 1813, in full_dispatch_request
rv = self.dispatch_request()
File "C:\Users\jmb13\AppData\Roaming\Python\Python37\site-packages\flask\app.py", line 1799, in dispatch_request
return self.view_functions[rule.endpoint](**req.view_args)
File "c:\Users\jmb13\OneDrive-A Level Computer Science - Coding Project\Python Files\A-Level-Project\itroom\routes.py", line 17, in login
user = User.query.filter_by(email=form.userEmail.data).first()
AttributeError: 'LoginForm' object has no attribute 'userEmail'
之后用户将被直接重定向到主页。我确定这是我为登录表单创建的 class 的问题。任何帮助表示赞赏。登录表单的代码在 forms.py
中,检查电子邮件和密码的代码在 routes.py
中。当我尝试创建登录时开始出现此错误,并且我更改了 models.py
,我的数据库模型文件。我也为登录页面添加了 HTML,以防那是我的问题所在。
forms.py:
from flask_wtf import FlaskForm
from wtforms import StringField, PasswordField, SubmitField, BooleanField
from wtforms.validators import DataRequired, Length, Email, EqualTo, ValidationError
from itroom.models import User
class LoginForm(FlaskForm):
email = StringField('Email',validators=[DataRequired(), Email()])
password = PasswordField('Password', validators=[DataRequired()])
remember = BooleanField('Remember Me')
submit = SubmitField('Login')
routes.py:
from flask import Flask, render_template, url_for, flash, redirect, request
from itroom import app, db, bcrypt
from itroom.forms import LoginForm, AddUserForm
from itroom.models import User, Post
from flask_login import login_user
@app.route("/login", methods=['GET', 'POST']) #defines the HTML loaded for /login
def login():
form = LoginForm()
if form.validate_on_submit():
user = User.query.filter_by(email=form.userEmail.data).first()
if user and bcrypt.check_password_hash(user.userPassword, form.password.data):
login_user(user, remember=form.remember.data)
return redirect(url_for('home'))
else:
flash('Login Unsucessful, Please check email and password', 'danger')
return render_template('login.html',form=form, title='Login')
models.py
class User(db.Model, UserMixin):
id = db.Column(db.Integer, primary_key=True)
userEmail = db.Column(db.String(120), unique=True, nullable=False)
userPassword = db.Column(db.String(60), nullable=False)
posts = db.relationship('Post', backref='author', lazy=True)
def __repr__(self):
#return f"User('{self.username}', '{self.email}')"
return f"User('User')"
login.html
<body>
<h2 align="center" style="padding: 2.5%;"></h2>
<img src="/static/Logo.png" alt="Logo" class="avatar">
<form method="POST" action="">
{{form.hidden_tag() }}
<div class="form-group">
{{form.email.label}}
{% if form.email.errors %}
{{form.email(size=30, class="form-control is-invalid")}}
<div class="invalid-feedback">
{% for error in form.email.errors %}
<span>{{ error }}</span>
{% endfor %}
</div>
{% else %}
{{form.email(size=30, class="form-control")}}
{% endif %}
</div>
{{form.password.label}} <br>
{{form.password(size=30)}}
{{form.remember}} <br>
{{form.submit(class="btn btn-outline-info")}} <br>
</form>
<div class="container" style="background-color:#f1f1f1">
<span class="psw">Forgot <a href="#">password?</a></span>
</div>
</form>
</div>
</body>
</html>
您需要更改路由中的 SQL 查询,因为变量混淆了。更正后的代码是:
user = User.query.filter_by(userEmail=form.email.data).first()