
本文详细介绍了如何在flask web应用中,通过结合后端python逻辑和前端jinja2模板引擎,实现表单提交后的成功或错误消息的动态显示。这种方法利用服务器端变量进行条件渲染,避免了对客户端j*ascript的依赖,提供了一种简洁高效的反馈机制,并涵盖了后端的错误处理和前端的模板集成。
在Web开发中,用户提交表单后,提供即时反馈是提升用户体验的关键。本教程将指导您如何在基于Flask和Jinja2的Python应用中,无需复杂的J*aScript,即可在表单提交后显示成功或错误消息。我们将通过修改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 元素:
ChatCut
AI
视频剪辑工具
1086
查看详情
<!-- 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应用中实现表单提交后的成功/错误消息显示的详细内容,更多请关注其它相关文章!
相关文章:
在Pyomo中实现基于变量的条件约束:Big-M方法详解
MongoDB Aggregation:在嵌套对象数组中精确匹配ObjectId
cad怎么合并重叠的线段_cad清理重复重叠线条的操作方法
动漫共和国防屏蔽稳定域名-动漫共和国官方正版直达通道
高德地图怎么看全景照片_高德地图全景照片浏览教程
Win11怎么查看显卡显存 Win11显示适配器属性及专用视频内存查询
处理Kafka消费者会话超时:深入理解消息处理语义与幂等性
J*aScript生成器_j*ascript异步迭代
J*a TimerTask文件监控:HashMap状态管理与常见陷阱规避指南
《GTA6》开发画面疑似泄露!这次可不是AI了
CSS布局中意外空白:解决padding-top导致的顶部间距问题
蛙漫安全无毒 官方认证的绿色入口
支付宝解绑银行卡步骤_支付宝如何解除绑定银行卡
2026春节假期时间安排 2026春节假日查询
AO3最新镜像入口 Archive of Our Own官方平台访问
基于动态规划的房屋花卉种植最小成本算法详解
俄罗斯浏览器官网直达链接 俄罗斯浏览器最新在线入口导航
怎么在mac上运行html代码_mac运行html代码方法【指南】
Linux如何排查内存不足OOME问题_LinuxOOM分析教程
vivo手机参数配置怎么增强信号_vivo手机参数配置信号增强方法
蛙漫限时开放最深处链接_蛙漫全站漫画会员同款秒开地址
PHP文件上传至S3:策略、考量与避免本地存储的挑战
构建轻量级网站内部消息系统:Formspree 集成指南
海棠电脑版入口_通过电脑访问海棠官网阅读
如何使用CaptainHook和Composer管理Git钩子_在提交前自动运行代码检查的Composer配置
Composer的 "conflict" 字段有什么用_如何声明不兼容的包以避免依赖冲突
解决PHP会话Cookie在跨域请求中不保留的问题
j*a toString()的覆盖
谷歌浏览器浏览体验优化_谷歌浏览器新版直连永久可用提示
向日葵客户端怎么进行远程CentOS控制_向日葵客户端远程CentOS控制操作教程
解决 Vaadin 8 中大文件音频播放与定位时出现的 IOException
Lar*el头像管理:图片缩放与旧文件删除的最佳实践
Pygame教程:解决用户输入与游戏状态更新不同步问题
狙击外星人小游戏开始_狙击外星人小游戏立即开始
俄罗斯Yandex搜索引擎入口_Yandex官网免登录一键访问
Selenium Python中处理点击后新窗口加载冻结问题的策略与实践
解决macOS Tkinter应用双击启动崩溃:PyInstaller打包指南
在哪找SublimeJ远程工具_SFTP插件配置教程
Composer的 "licenses" 命令如何帮助你遵守开源协议_检查项目依赖的许可证合规性
Golang如何实现微服务鉴权与权限控制_Golang微服务鉴权与权限管理实践
漫蛙漫画官方首页 漫蛙2漫画在线阅读入口
顺丰快递查单号物流信息 顺丰快递小程序查询入口
word邮件合并后日期格式不对怎么改_Word邮件合并日期格式修改方法
天猫双十一预售商品怎么退款_天猫双十一预售退款操作指南
c++ 命名空间怎么用 c++ namespace使用指南
Spring Boot内嵌服务器与J*a EE全栈特性:选择与部署策略
谷歌浏览器无痕模式怎么开 Chrome开启无痕浏览设置方法【教程】
谷歌邮箱网页版官方页面入口 谷歌邮箱网页端快速访问
菜鸟取件码是什么怎么查 最全查询渠道汇总
J*aScript对象创建方式_J*aScript设计模式应用