刚用 flask ,在写一个验证码的生成和验证时遇到了问题:
我定义了一个captcha()
,用于处理'/captcha'
这个 url ,代码如下:
@app.route('/captcha')
def captcha():
from captcha.image import ImageCaptcha
from random import random
image = ImageCaptcha()
x = int(round(random() * 10000))
if x < 1000: x += 1000
session['CAPTCHA_NUM'] = x
return image.generate(str(session['CAPTCHA_NUM']), 'png').getvalue()
在 register.html 里调用:
图形验证码:<input type="text" name="captcha" onblur="validate_captcha()" /><label id="captcha_v"></label><br/>
<img id="vcode" src="{{url_for('captcha')}}" alt="captcha" /><a href="javascript:void(0)" onclick="change_one()">换一张</a><br/>
然后,每当我点击一次‘换一张’
,验证码图片会更新;
在captcha()
中利用print
发现session[CAPTCHA_NUM]
也更新了;
但在register.html
调用{{session[CAPTCHA_NUM]}}
的话,并没有更新;
只有刷新页面后,页面的session[CAPTCHA_NUM]
才会更新成之前的值,但这时验证码已经又更新了,所以session[CAPTCHA_NUM]
还是和验证码不同的值
哪里出问题了:(?
这是change_one()
:
//'换一张'的功能
function change_one() {
$('img[id=vcode]').attr("src", "{{url_for('captcha')}}?a="+new Date().getTime());
};
这是validate_captcha()
:
//验证输入的验证码
function validate_captcha() {
var captcha = $(':input[name=captcha]').val();
if(captcha == '') {
$('captcha_v').text('验证码不能为空!');
}else if(captcha != {{session['CAPTCHA_NUM']}}){
$('captcha_v').text('验证码错误!');
}else {
$('captcha_v').text('');
}
};
1
onlyxuyang 2015-11-09 12:32:10 +08:00 via Android
我的理解是 change_one 没有引发 img 的 src 属性重新 reload 一次…… 它应只在页面加载的时候 request 一次 captcha 吧你怎么点 change_one 它都不会再去 load 一次 captcha
|
2
winnielmz OP @onlyxuyang 谢谢回复。确实只在页面刷新的时候, session[CAPTCHA_NUM] 才会变化; 但我在点击'换一张'的超链接的时候访问了`captcha()`函数,在里面更改了 session[CAPTCHA_NUM] ----这样没什么作用的话,是不是说页面的 session 不是动态更新的呢?
|
3
winnielmz OP 又看了一遍 session 的官方文档,发现:
This variable is unavailable if the template was rendered without an active request context. 这里的‘ active request ’应该是像页面刷新,表单提交之类的请求吧----我这里只是更改了 img 的 src ,应该不算'active request',所以 session['CAPTCHA_NUM']才没有变化 |
4
JhOOOn 2016-02-27 15:33:14 +08:00
@winnielmz 您好,请问您最后是怎么解决的?我实现的方法和您差不多,我把判断放到了 flask 的视图函数中,如果不想等,我就重新返回原始界面,按您所得应该算一次 active request 了,但是 session 里保存的值一直不变。
""" @main.route('/', methods=['POST', 'GET']) def login(): if form.code.data == session['code']: do something return render_template("login.html") @main.route('/code') def gen_code(): code = code() session['code']=code return code """ 如果能看到,希望您能解答下,谢谢。 |
5
JhOOOn 2016-02-27 15:35:18 +08:00
|
6
alvy 2016-07-29 12:11:03 +08:00
与楼主同样的问题。不知道如何解决。
实在不行考虑用缓存了 |