我目前正在进行一个100天的代码项目,但是我被卡住了。我无法渲染success .html。和";Denied.html"模板在我的登录路由代码。我将包括代码的python和html部分。任何见解都是值得赞赏的。我认为问题是在登录路由代码中,但是我已经撞墙了,不知道现在该怎么做。
import email_validator
from flask import Flask, render_template, request
from flask_wtf import FlaskForm
from flask_wtf.csrf import CSRFProtect
from wtforms.validators import Email, Length, DataRequired, ValidationError
from wtforms import StringField, PasswordField, SubmitField
from email_validator import validate_email
# create a flask instance
app = Flask(__name__)
# CSRF protection
app.secret_key = "123456"
#disabling CSRF Protection
# app.config['WTF_CSRF_ENABLED'] = False
# create a form class
class LoginForm(FlaskForm):
def validate_email(self, field):
# Custom email validation using email_validator
try:
validate_email(field.data)
except Exception as e:
raise ValidationError(str(e))
email = StringField(label="Email", validators=[DataRequired(), Email()], render_kw={"size": 30})
password = PasswordField(label="Password", validators=[DataRequired(), Length(min=8)], render_kw={"size": 30})
submit = SubmitField(label="Log In")
# create a route decorator
@app.route('/', methods=["GET", "POST"])
def login():
form = LoginForm()
form.validate_on_submit()
print(request.method)
print(form.email.data)
print(form.password.data)
return render_template('login.html', form=form)
@app.route('/login', methods=["GET", "POST"])
def login_info():
form = LoginForm()
if form.validate_on_submit():
if form.email.data == "admin@email.com" and form.password.data == "12345678":
print(request.method)
print(type(form.email.data))
print(type(form.password.data))
return render_template('success.html')
else:
return render_template('denied.html')
else:
return render_template('login.html', form=form)
if __name__ == "__main__":
app.run(debug=True)
登录页面的HTML代码如下
<!DOCTYPE HTML>
<html>
<head>
<title>Login</title>
</head>
<body>
<div class="container">
<h1>Login Page</h1>
<form method="post" action="{{ url_for('login')}}" novalidate>
{{form.csrf_token}}
<p>
{{form.email.label}} <br> {{form.email}}
{% for err in form.email.errors %}
<span style="color:red">{{ err }}</span>
{% endfor %}
</p>
<p>
{{form.password.label}} <br> {{form.password}}
{% for err in form.password.errors %}
<span style="color:red">{{ err }}</span>
{% endfor %}
</p>
{{form.submit}}
</form>
</div>
</body>
</html>
您将表单提交到错误的端点。表单的action
属性引用的是login
,而不是login_info
。
通常情况下,您将希望GET
到登录视图仅提供表单(login.html
)和POST
来处理提交的登录详细信息,然后将用户重定向到您想要他们去的地方(或者在您的情况下仅显示success.html
)。
你有一些复杂的事情,有2个视图,都采取GET
和POST
,但login_info
一个没有引用在你的login.html
的任何地方,所以它从来没有实际使用。login
视图调用.validate_on_submit()
,但总是只返回login.html
,这就是为什么你从来没有看到success.html
。