我正在嘗試為我在 Flask 中的聯系頁面構建一個簡單的數字驗證碼。聯系人頁面端點以 GET 模式加載并初始化驗證碼驗證的值。當我在 POST 模式下提交表單時,我希望用戶輸入的表單值與驗證碼值匹配。但是,它沒有按預期作業。我對列印陳述句進行了一些故障排除,以查看值是如何變化的,并且驗證碼變數似乎正在通過 POST 操作重新初始化。有人可以建議一個解決方法嗎?我的 Python 代碼在下面共享:
@bp.route('/contact/', methods=('GET', 'POST'))
def contact():
# Initialize captcha values
cap_a = random.randint(0, 9)
cap_b = random.randint(0, 9)
cap_prod = cap_a * cap_b
print(cap_a, cap_b, cap_prod)
if request.method == "POST":
error = None
log_file = current_app.config['LOGFILE']
full_name = request.form['fullname']
email_addr = request.form['email']
phone_no = request.form['phone']
msg_body = request.form['message']
num_prod = request.form['verifycaptcha']
print(cap_a, cap_b, cap_prod)
print(full_name, email_addr, phone_no, msg_body, num_prod)
if not full_name:
error = 'Full name is required.'
elif not email_addr:
error = 'Email address is required.'
elif not msg_body:
error = 'Message body is required.'
if num_prod != cap_prod:
error = 'Incorrect captcha verification.'
if error is None:
# Perform some operations
pass
try:
with current_app.app_context():
mail = Mail()
mail.init_app(current_app)
mail.send(msg)
error = 'Mail sent successfully!'
except:
error = 'Mail engine error encountered. Please retry after some time.'
f = open(log_file, "a")
f.write('[' datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S') '] ' error '\n')
f.close()
flash(error)
return render_template('contact.html',num_a = cap_a, num_b = cap_b)
uj5u.com熱心網友回復:
cap_a = random.randint(0, 9)
cap_b = random.randint(0, 9)
cap_prod = cap_a * cap_b
這些是 2 個亂數,您正在創建 cap_prod。您沒有將 cap_prod 保存在任何地方。相反,當 POST 請求到來時,您會再次計算它(這次它將是 2 個新的亂數)
您需要保存在 GET 期間創建的驗證碼,然后在 POST 到來時,與最初發送的值進行比較。
如果您將來要支持 refresh-captcha 影像(您需要有一個 API 呼叫來生成一個新的驗證碼并保存它)
uj5u.com熱心網友回復:
我通過將驗證碼變數存盤在 Flask 的會話字典中并在重新初始化值之前檢查它的存在來找到解決方案。
def contact():
# Initialize captcha values
if 'product' not in session:
cap_a = random.randint(0, 9)
cap_b = random.randint(0, 9)
session['captcha_a'] = cap_a
session['captcha_b'] = cap_b
session['product'] = cap_a * cap_b
else:
cap_a = session.get('captcha_a')
cap_b = session.get('captcha_b')
if request.method == "POST":
pass
# Rest of the code
可以在Fadmeter.com和FadURL.com找到上述解決方案的作業示例。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/460495.html
標籤:Python html python-3.x 烧瓶 邮政
