You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Flask+Bootstrap表单提交后显示成功与错误提示信息?

问题描述

我用Bootstrap、Python、HTML开发网站,没写CSS(需要的话可以补充)。已经通过smtplib和Flask实现了邮件发送功能,现在想在表单提交后显示成功和错误提示信息,请问该怎么写代码?需要用JavaScript吗,还是只用Flask就能实现?

以下是我的代码:

server.py

from flask import Flask, render_template, request
import smtplib

MY_EMAIL = "your email"
MY_PASSWORD = "your pw"

app = Flask(__name__)

@app.route('/', methods=["GET", "POST"])
def home():
    if request.method == "POST":
        data = request.form
        print(data["name"])
        print(data["email"])
        print(data["phone"])
        print(data["message"])

        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\n\nName: {data['name']}\nEmail: {data['email']}\nPhone: {data['phone']}\nMessage: {data['message']}"
            )

        return render_template("index.html", msg_sent=True)
    return render_template("index.html", msg_sent=False)

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>
            <!-- Submit success message-->
            <!-- This is what your users will see when the form-->
            <!-- has successfully submitted-->
            <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-->
            <!-- This is what your users will see when there is-->
            <!-- an error submitting the form-->
            <div class="d-none" id="submitErrorMessage"><div class="text-center text-danger mb-3">Error sending message!</div></div>
            <!-- 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实现(无需JavaScript)

你的现有代码已经在传递msg_sent参数,但缺少错误捕获和提示显示逻辑,修改如下:

1. 更新server.py(添加异常捕获)

from flask import Flask, render_template, request
import smtplib
from smtplib import SMTPException

MY_EMAIL = "your email"
MY_PASSWORD = "your pw"

app = Flask(__name__)

@app.route('/', methods=["GET", "POST"])
def home():
    msg_sent = False
    send_error = False
    if request.method == "POST":
        data = request.form
        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\n\nName: {data['name']}\nEmail: {data['email']}\nPhone: {data['phone']}\nMessage: {data['message']}"
                )
            msg_sent = True
        except SMTPException as e:
            print(f"邮件发送失败: {e}")
            send_error = True
    return render_template("index.html", msg_sent=msg_sent, send_error=send_error)

if __name__ == "__main__":
    app.run(debug=True)

2. 修改index.html(动态显示提示)

替换原有的固定提示框,用Jinja2模板变量控制显示:

<!-- 替换原成功/错误提示框 -->
{% if msg_sent %}
<div class="text-center text-success mb-3">
    <div class="fw-bolder">表单提交成功!已收到你的消息</div>
</div>
{% endif %}

{% if send_error %}
<div class="text-center text-danger mb-3">
    <div class="fw-bolder">发送失败,请稍后重试或检查邮箱配置</div>
</div>
{% endif %}

如果想保留原有ID结构,也可以修改类名:

<div class="{{ 'd-block' if msg_sent else 'd-none' }}" id="submitSuccessMessage">
    <div class="text-center text-success mb-3">
        <div class="fw-bolder">表单提交成功!已收到你的消息</div>
    </div>
</div>
<div class="{{ 'd-block' if send_error else 'd-none' }}" id="submitErrorMessage">
    <div class="text-center text-danger mb-3">
        <div class="fw-bolder">发送失败,请稍后重试</div>
    </div>
</div>

可选:成功提交后清空表单

{% if msg_sent %}
<script>
    document.getElementById('contactForm').reset();
</script>
{% endif %}

方案二:用JavaScript实现无刷新提交(提升体验)

如果不想页面刷新,用AJAX提交表单:

1. 更新server.py(返回JSON响应)

from flask import Flask, render_template, request, jsonify
import smtplib
from smtplib import SMTPException

MY_EMAIL = "your email"
MY_PASSWORD = "your pw"

app = Flask(__name__)

@app.route('/', methods=["GET"])
def home():
    return render_template("index.html")

@app.route('/send-email', methods=["POST"])
def send_email():
    if request.method == "POST":
        data = request.form
        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\n\nName: {data['name']}\nEmail: {data['email']}\nPhone: {data['phone']}\nMessage: {data['message']}"
                )
            return jsonify({"status": "success"})
        except SMTPException as e:
            print(f"邮件发送失败: {e}")
            return jsonify({"status": "error", "message": str(e)}), 500

2. 修改index.html(添加AJAX逻辑)

<!-- 表单去掉action和method,保留原内容 -->
<form id="contactForm">
    <!-- 原表单内容不变 -->
</form>

<script>
document.getElementById('contactForm').addEventListener('submit', function(e) {
    e.preventDefault(); // 阻止默认页面刷新提交

    const formData = new FormData(this);
    const submitBtn = document.getElementById('submitButton');
    const successMsg = document.getElementById('submitSuccessMessage');
    const errorMsg = document.getElementById('submitErrorMessage');

    // 禁用按钮防止重复提交
    submitBtn.disabled = true;
    submitBtn.textContent = '发送中...';

    // 隐藏之前的提示
    successMsg.classList.add('d-none');
    errorMsg.classList.add('d-none');

    fetch('/send-email', {
        method: 'POST',
        body: formData
    })
    .then(response => response.json())
    .then(data => {
        if (data.status === 'success') {
            successMsg.classList.remove('d-none');
            document.getElementById('contactForm').reset(); // 清空表单
        } else {
            errorMsg.classList.remove('d-none');
        }
        // 恢复按钮状态
        submitBtn.disabled = false;
        submitBtn.textContent = 'Send Message';
    })
    .catch(error => {
        errorMsg.classList.remove('d-none');
        submitBtn.disabled = false;
        submitBtn.textContent = 'Send Message';
    });
});
</script>

注意事项

  • 用Gmail的话,建议使用应用专用密码(需开启两步验证),不要开启低安全性应用访问
  • 前端可保留Bootstrap原生表单验证,确保必填项已填写
  • 生产环境关闭Flask的debug=True,并配置正确的邮件服务器参数

内容的提问来源于stack exchange,提问作者JIEUN PARK

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 00:01:39