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

Flask实现用户输入后页面实时显示Luhn算法校验结果问题

Flask实现Luhn算法卡号校验(无刷新/同页显示结果)

先纠正你之前的模板错误

你用的 <p>{{print('is card valid? ')+valid}}</p> 有两个问题:

  1. Jinja2模板里的print()是把内容输出到服务器控制台,不是前端页面,完全不会在网页上显示。
  2. Jinja2中字符串和变量拼接要用~运算符,而非+,正确写法是{{ 'is card valid? ' ~ valid }},但这只是语法修正,核心问题是要正确传递校验结果到模板并处理表单提交逻辑。

下面提供两种可行方案,根据需求选择:


方案1:后端渲染(表单提交后返回同页带结果)

这是最简单的实现,不需要JS,表单提交后后端处理校验,把结果传回模板显示。

修改后的Python代码

from flask import Flask, render_template, request

app = Flask(__name__)

# 你的Luhn算法实现(示例)
def luhn_check(card_number):
    digits = [int(d) for d in str(card_number) if d.isdigit()]
    if len(digits) < 13:
        return False
    # Luhn核心逻辑
    odd_digits = digits[-1::-2]
    even_digits = digits[-2::-2]
    total = sum(odd_digits)
    for d in even_digits:
        total += sum([int(x) for x in str(d*2)])
    return total % 10 == 0

@app.route('/', methods=['GET', 'POST'])
def index():
    valid = None
    card_number = ""
    if request.method == 'POST':
        card_number = request.form.get('card_number', '').strip()
        if card_number:
            valid = luhn_check(card_number)
    # 将结果和用户输入的卡号传回模板
    return render_template('index.html', valid=valid, card_number=card_number)

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

修改后的HTML模板

<!DOCTYPE html>
<html>
<head>
    <title>卡号校验工具</title>
    <link rel="stylesheet" href="{{ url_for('static', filename='style.css') }}">
</head>
<body>
    <div class="card-checker">
        <h2>Luhn卡号校验</h2>
        <form method="POST">
            <input type="text" name="card_number" placeholder="请输入银行卡/信用卡号" value="{{ card_number }}">
            <button type="submit">立即校验</button>
        </form>
        <!-- 条件渲染校验结果 -->
        {% if valid is not none %}
            <p class="result">
                卡号是否有效:<span class="{{ 'valid' if valid else 'invalid' }}">{{ '是' if valid else '否' }}</span>
            </p>
        {% endif %}
    </div>
</body>
</html>

配套CSS示例(static/style.css)

.card-checker {
    max-width: 400px;
    margin: 50px auto;
    text-align: center;
}
input {
    width: 80%;
    padding: 10px;
    margin: 15px 0;
    border: 1px solid #ddd;
    border-radius: 4px;
}
button {
    padding: 10px 20px;
    background: #2196F3;
    color: white;
    border: none;
    border-radius: 4px;
    cursor: pointer;
}
.result {
    margin-top: 20px;
    font-size: 18px;
}
.valid { color: #4CAF50; }
.invalid { color: #F44336; }

方案2:AJAX无刷新实时校验

如果想要完全不刷新页面(真正的“实时”),用JavaScript发送异步请求,后端返回JSON结果,前端动态更新页面。

修改后的Python代码

from flask import Flask, render_template, request, jsonify

app = Flask(__name__)

def luhn_check(card_number):
    digits = [int(d) for d in str(card_number) if d.isdigit()]
    if len(digits) < 13:
        return False
    odd_digits = digits[-1::-2]
    even_digits = digits[-2::-2]
    total = sum(odd_digits)
    for d in even_digits:
        total += sum([int(x) for x in str(d*2)])
    return total % 10 == 0

# 主页面路由
@app.route('/')
def index():
    return render_template('index.html')

# 校验API路由
@app.route('/check-card', methods=['POST'])
def check_card():
    card_number = request.json.get('card_number', '').strip()
    if not card_number:
        return jsonify({'valid': False, 'msg': '请输入卡号'})
    # 过滤非数字字符
    clean_card = ''.join([d for d in card_number if d.isdigit()])
    valid = luhn_check(clean_card)
    return jsonify({'valid': valid, 'msg': '校验完成'})

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

修改后的HTML模板

<!DOCTYPE html>
<html>
<head>
    <title>无刷新卡号校验</title>
    <link rel="stylesheet" href="{{ url_for('static', filename='style.css') }}">
</head>
<body>
    <div class="card-checker">
        <h2>Luhn卡号校验</h2>
        <form id="checkForm">
            <input type="text" id="cardNumber" placeholder="请输入银行卡/信用卡号">
            <button type="submit">立即校验</button>
        </form>
        <div id="resultArea"></div>
    </div>

    <script>
        const form = document.getElementById('checkForm');
        const resultArea = document.getElementById('resultArea');
        const cardInput = document.getElementById('cardNumber');

        // 阻止表单默认提交行为
        form.addEventListener('submit', async (e) => {
            e.preventDefault();
            const cardNumber = cardInput.value.trim();
            
            if (!cardNumber) {
                resultArea.innerHTML = '<p style="color: red;">请输入卡号</p>';
                return;
            }

            // 发送AJAX请求
            try {
                const response = await fetch('/check-card', {
                    method: 'POST',
                    headers: {'Content-Type': 'application/json'},
                    body: JSON.stringify({card_number: cardNumber})
                });
                const data = await response.json();
                
                if (data.valid) {
                    resultArea.innerHTML = '<p style="color: #4CAF50;">卡号有效 ✅</p>';
                } else {
                    resultArea.innerHTML = '<p style="color: #F44336;">卡号无效 ❌</p>';
                }
            } catch (err) {
                resultArea.innerHTML = '<p style="color: #F44336;">校验失败,请重试</p>';
            }
        });
    </script>
</body>
</html>

内容的提问来源于stack exchange,提问作者Joseph Beegle

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.28 22:25:34