flask 的 session 内存储的变量不能更新

2015-11-09 11:47:19 +08:00
 winnielmz
刚用 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]`还是和验证码不同的值
哪里出问题了:(?
2939 次点击
所在节点    问与答
6 条回复
onlyxuyang
2015-11-09 12:32:10 +08:00
我的理解是 change_one 没有引发 img 的 src 属性重新 reload 一次…… 它应只在页面加载的时候 request 一次 captcha 吧你怎么点 change_one 它都不会再去 load 一次 captcha
winnielmz
2015-11-09 15:41:40 +08:00
@onlyxuyang 谢谢回复。确实只在页面刷新的时候, session[CAPTCHA_NUM] 才会变化; 但我在点击'换一张'的超链接的时候访问了`captcha()`函数,在里面更改了 session[CAPTCHA_NUM] ----这样没什么作用的话,是不是说页面的 session 不是动态更新的呢?
winnielmz
2015-11-09 16:23:15 +08:00
又看了一遍 session 的官方文档,发现:
This variable is unavailable if the template was rendered without an active request context.
这里的‘ active request ’应该是像页面刷新,表单提交之类的请求吧----我这里只是更改了 img 的 src ,应该不算'active request',所以 session['CAPTCHA_NUM']才没有变化
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
"""
如果能看到,希望您能解答下,谢谢。
JhOOOn
2016-02-27 15:35:18 +08:00
@JhOOOn 重新发下代码:
```python
@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

```
alvy
2016-07-29 12:11:03 +08:00
与楼主同样的问题。不知道如何解决。
实在不行考虑用缓存了

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/234743

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX