V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
winnielmz
V2EX  ›  问与答

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

  •  
  •   winnielmz · 2015-11-09 11:47:19 +08:00 · 2732 次点击
    这是一个创建于 3062 天前的主题,其中的信息可能已经有所发展或是发生改变。

    刚用 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]还是和验证码不同的值
    哪里出问题了:(?

    第 1 条附言  ·  2015-11-09 15:34:37 +08:00

    这是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('');
        }
    };
    
    6 条回复    2016-07-29 12:11:03 +08:00
    onlyxuyang
        1
    onlyxuyang  
       2015-11-09 12:32:10 +08:00 via Android
    我的理解是 change_one 没有引发 img 的 src 属性重新 reload 一次…… 它应只在页面加载的时候 request 一次 captcha 吧你怎么点 change_one 它都不会再去 load 一次 captcha
    winnielmz
        2
    winnielmz  
    OP
       2015-11-09 15:41:40 +08:00
    @onlyxuyang 谢谢回复。确实只在页面刷新的时候, session[CAPTCHA_NUM] 才会变化; 但我在点击'换一张'的超链接的时候访问了`captcha()`函数,在里面更改了 session[CAPTCHA_NUM] ----这样没什么作用的话,是不是说页面的 session 不是动态更新的呢?
    winnielmz
        3
    winnielmz  
    OP
       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
        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
    """
    如果能看到,希望您能解答下,谢谢。
    JhOOOn
        5
    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
        6
    alvy  
       2016-07-29 12:11:03 +08:00
    与楼主同样的问题。不知道如何解决。
    实在不行考虑用缓存了
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   3484 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 32ms · UTC 11:02 · PVG 19:02 · LAX 04:02 · JFK 07:02
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.