
本文详细介绍了如何在flask web应用中,通过结合后端python逻辑和前端jinja2模板引擎,实现表单提交后的成功或错误消息的动态显示。这种方法利用服务器端变量进行条件渲染,避免了对客户端javascript的依赖,提供了一种简洁高效的反馈机制,并涵盖了后端的错误处理和前端的模板集成。
在Web开发中,用户提交表单后,提供即时反馈是提升用户体验的关键。本教程将指导您如何在基于Flask和Jinja2的Python应用中,无需复杂的JavaScript,即可在表单提交后显示成功或错误消息。我们将通过修改Flask后端逻辑来处理表单数据并发送邮件,然后利用Jinja2模板引擎在前端根据后端处理结果动态渲染相应的消息。
实现表单提交后的反馈消息,其核心思想是:
我们将基于现有代码进行优化和扩展。
首先,我们需要在Flask应用中处理表单提交,并根据邮件发送结果来设置一个状态变量。为了更好地区分成功和失败,我们可以传递一个表示消息状态的字符串,或者两个独立的布尔变量。这里我们采用传递一个 message_type 和 message_text 的方式,这样可以更灵活地控制显示内容。
from flask import Flask, render_template, request
# 建议将敏感信息如邮箱和密码存储在环境变量或配置文件中
MY_EMAIL = "your_email@example.com"
MY_PASSWORD = "your_app_password" # 如果使用Gmail,需要生成应用专用密码
app = Flask(__name__)
@app.route('/', methods=["GET", "POST"])
def home():
message_type = None # 'success' or 'error'
message_text = None
if request.method == "POST":
data = request.form
name = data.get("name")
email = data.get("email")
phone = data.get("phone")
message = data.get("message")
# 简单的数据验证
if not all([name, email, phone, message]):
message_type = 'error'
message_text = '请填写所有必填项。'
else:
try:
with smtplib.SMTP("smtp.gmail.com", port=587) as connection:
connection.starttls() # 启动TLS加密
connection.login(user=MY_EMAIL, password=MY_PASSWORD)
connection.sendmail(
from_addr=MY_EMAIL,
to_addrs=MY_EMAIL, # 可以改为接收者邮箱
msg=f"Subject:New Message from {name}\n\n"
f"Name: {name}\n"
f"Email: {email}\n"
f"Phone: {phone}\n"
f"Message: {message}"
)
message_type = 'success'
message_text = '您的消息已成功发送!感谢您的联系。'
except Exception as e:
print(f"邮件发送失败: {e}")
message_type = 'error'
message_text = '发送消息时出现错误,请稍后再试。'
# 渲染模板时传递消息类型和内容
return render_template("index.html", message_type=message_type, message_text=message_text)
if __name__ == "__main__":
app.run(debug=True)
代码修改说明:
接下来,我们需要修改 index.html 文件,利用Jinja2的条件渲染功能来显示后端传递过来的消息。我们将使用Bootstrap的 alert 组件来美化消息显示。
找到 index.html 中原有的用于显示成功和错误消息的 div 元素:
<!-- Submit success message-->
<div class="d-none" id="submitSuccessMessage">
<div class="text-center text-white mb-3">
<div class="fw-bolder">Form submission successful!</div>
</div>
</div>
<!-- Submit error message-->
<div class="d-none" id="submitErrorMessage"><div class="text-center text-danger mb-3">Error sending message!</div></div>将其替换为如下的Jinja2条件渲染代码:
<!-- Feedback Messages -->
{% if message_type %}
<div class="text-center mb-3">
{% if message_type == 'success' %}
<div class="alert alert-success" role="alert">
<div class="fw-bolder">{{ message_text }}</div>
</div>
{% elif message_type == 'error' %}
<div class="alert alert-danger" role="alert">
<div class="fw-bolder">{{ message_text }}</div>
</div>
{% endif %}
</div>
{% endif %}
<!-- Submit Button (保持不变) -->
<div class="text-center">
<button class="btn btn-primary btn-xl text-uppercase" id="submitButton" type="submit">Send Message</button>
</div>代码修改说明:
server.py
from flask import Flask, render_template, request
import smtplib
# 建议将敏感信息如邮箱和密码存储在环境变量或配置文件中
MY_EMAIL = "your_email@example.com" # 替换为您的发件邮箱
MY_PASSWORD = "your_app_password" # 替换为您的应用专用密码 (Gmail需要)
app = Flask(__name__)
@app.route('/', methods=["GET", "POST"])
def home():
message_type = None # 'success' or 'error'
message_text = None
if request.method == "POST":
data = request.form
name = data.get("name")
email = data.get("email")
phone = data.get("phone")
message = data.get("message")
# 简单的数据验证
if not all([name, email, phone, message]):
message_type = 'error'
message_text = '请填写所有必填项。'
else:
try:
with smtplib.SMTP("smtp.gmail.com", port=587) as connection:
connection.starttls()
connection.login(user=MY_EMAIL, password=MY_PASSWORD)
connection.sendmail(
from_addr=MY_EMAIL,
to_addrs=MY_EMAIL, # 可以改为接收者邮箱,或一个固定的通知邮箱
msg=f"Subject:New Message from {name}\n\n"
f"Name: {name}\n"
f"Email: {email}\n"
f"Phone: {phone}\n"
f"Message: {message}"
)
message_type = 'success'
message_text = '您的消息已成功发送!感谢您的联系。'
except smtplib.SMTPAuthenticationError:
print("SMTP认证失败,请检查邮箱和应用密码。")
message_type = 'error'
message_text = '邮件发送失败:认证错误,请联系网站管理员。'
except smtplib.SMTPException as e:
print(f"邮件发送失败: {e}")
message_type = 'error'
message_text = f'邮件发送失败: {e},请稍后再试。'
except Exception as e:
print(f"发生未知错误: {e}")
message_type = 'error'
message_text = '发生未知错误,请稍后再试。'
return render_template("index.html", message_type=message_type, message_text=message_text)
if __name__ == "__main__":
app.run(debug=True)
index.html (仅包含联系表单部分的关键修改)
<!-- Contact-->
<section class="resume-section" id="contact">
<div class="container">
<div class="resume-section-content">
<h2 class="mb-0">Contact Me</h2>
<div class="subheading mb-5">
If you are interested in me, I would love to hear it.
</div>
</div>
<form id="contactForm" action="{{ url_for('home') }}" method="post">
<div class="row align-items-stretch mb-5">
<div class="col-md-6">
<div class="form-group">
<!-- Name input-->
<input class="form-control" id="name" name="name" type="text" placeholder="Your Name *" data-sb-validations="required" />
<div class="invalid-feedback" data-sb-feedback="name:required">A name is required.</div>
</div>
<div class="form-group">
<!-- Email address input-->
<input class="form-control" id="email" name="email" type="email" placeholder="Your Email *" data-sb-validations="required,email" />
<div class="invalid-feedback" data-sb-feedback="email:required">An email is required.</div>
<div class="invalid-feedback" data-sb-feedback="email:email">Email is not valid.</div>
</div>
<div class="form-group mb-md-0">
<!-- Phone number input-->
<input class="form-control" id="phone" name="phone" type="tel" placeholder="Your Phone *" data-sb-validations="required" />
<div class="invalid-feedback" data-sb-feedback="phone:required">A phone number is required.</div>
</div>
</div>
<div class="col-md-6">
<div class="form-group form-group-textarea mb-md-0">
<!-- Message input-->
<textarea class="form-control" id="message" name="message" placeholder="Your Message *" data-sb-validations="required"></textarea>
<div class="invalid-feedback" data-sb-feedback="message:required">A message is required.</div>
</div>
</div>
</div>
<!-- Feedback Messages -->
{% if message_type %}
<div class="text-center mb-3">
{% if message_type == 'success' %}
<div class="alert alert-success" role="alert">
<div class="fw-bolder">{{ message_text }}</div>
</div>
{% elif message_type == 'error' %}
<div class="alert alert-danger" role="alert">
<div class="fw-bolder">{{ message_text }}</div>
</div>
{% endif %}
</div>
{% endif %}
<!-- Submit Button-->
<div class="text-center">
<button class="btn btn-primary btn-xl text-uppercase" id="submitButton" type="submit">Send Message</button>
</div>
</form>
</div>
</section>通过本教程,您已经学会了如何利用Flask的后端处理能力和Jinja2的模板渲染功能,在表单提交后向用户显示清晰的成功或错误消息。这种服务器端的方法简洁有效,尤其适用于不需要复杂实时交互的场景。结合适当的错误处理和用户体验考量,您可以为用户提供更友好、更可靠的Web应用体验。对于更高级的需求,如消息持久化和避免重复提交,推荐进一步学习Flask的 flash 消息机制。
以上就是在Flask应用中实现表单提交后的成功/错误消息显示的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号