是否有一种方法可以通过表单提交POST,而该表单在失败时不会更改页面?例如,我希望Flask仅返回一条将显示在表单下方的消息。
所有这些都无需使用AJAX
我当前的代码(json消息不起作用):
@app.route('/login', methods=['GET', 'POST'])
def login():
if request.method == 'POST':
return try_login(request.form.get('email'), request.form.get('password'))
else:
if 'username' in session:
return redirect(url_for('home'))
else:
return """
<form action="{}" method="post">
<label for="email">Email</label>
<input type="email" name="email" id="email">
<label for="password">Password</label>
<input type="password" name="password" id="password">
<input type="submit" value="Login">
</form>
""".format(url_for('login'))
def try_login(email, pswrd):
if email and pswrd:
usr = User.get_user_by_email(email)
if usr:
if usr.authenticate(pswrd):
return redirect(url_for('home'))
else:
return {'msg' : 'Wrong Password'}
else:
return {'msg' : 'User or Password wrong'}
else:
return {'msg' : 'Email and Password are required'}
答案 0 :(得分:1)
由于您不想使用AJAX,因此我假设您也不想使用任何其他形式的异步请求(部分加载HTML或JSON)。
但是,如果要部分更新任何HTML页面,则必须向服务器发出异步请求,然后将响应应用于要更改的HTML部分。
如果您不打算发出异步请求,则必须返回添加了消息的HTML页面。
例如,在您的代码中,您可以执行以下操作:
FORM_TEMPLATE = """
<form action="{}" method="post">
<label for="email">Email</label>
<input type="email" name="email" id="email">
<label for="password">Password</label>
<input type="password" name="password" id="password">
<input type="submit" value="Login">
</form>
"""
ERROR_TEMPLATE = """
<p style="color: red;"> {} </p>
"""
@app.route('/login', methods=['GET', 'POST'])
def login():
if request.method == 'POST':
return try_login(request.form.get('email'), request.form.get('password'))
else:
if 'username' in session:
return redirect(url_for('home'))
else:
FORM_TEMPLATE.format(url_for('login'))
def try_login(email, pswrd):
if email and pswrd:
usr = User.get_user_by_email(email)
if usr:
if usr.authenticate(pswrd):
return redirect(url_for('home'))
else:
return ERROR_TEMPLATE.format('Wrong Password') + FORM_TEMPLATE.format(url_for('login'))
else:
return ERROR_TEMPLATE.format('User or Password wrong') + FORM_TEMPLATE.format(url_for('login'))
else:
return ERROR_TEMPLATE.format('Email and Password are required') + FORM_TEMPLATE.format(url_for('login'))