Flask实现用户输入后页面实时显示Luhn算法校验结果问题
Flask实现Luhn算法卡号校验(无刷新/同页显示结果)
先纠正你之前的模板错误
你用的 <p>{{print('is card valid? ')+valid}}</p> 有两个问题:
- Jinja2模板里的
print()是把内容输出到服务器控制台,不是前端页面,完全不会在网页上显示。 - 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
相关产品推荐
相关产品推荐

