2015-07-12 76 views
1

编辑:实际上,我可以看到会话变量的值发生变化,但在给函数的下一次调用的值设置回0更改会话变量值失败

我的烧瓶初学者和我在更改会话变量的值时遇到问题。下面是我的代码的摘录:第一轮征求意见

0)我设置SECRET_KEY变量在我config.py后 编辑。

1)当在予用户登录设置会话变量:

@app.route('/login', methods=['GET', 'POST']) 
def login(): 
    session['info_released'] = 0 
    app.logger.debug('info_released session value: {}'.format(session['info_released']) 
    ... 

检查日志,会话变量的值被正确地设置为0。

2)I有一个counter通过request.json传递的变量会随时增加。一个counter增量和下面的一个与我检查以下条件数次(通过Ajax调用):

@app.route('/get_actual_demand', methods=['GET', 'POST']) 
def get_actual_demand(): 

    app.logger.info('> SESSION: {}'.format(session['info_released'])) 
    if request.json['counter'] == 10 and session['info_released'] == 0: 
     #code 
     session['info_released'] = 1 
     app.logger.info('> SESSION VAR. AFTER CHANGE: {}'.format(session['info_released'])) 
     return jsonify(released=1) 
    else: 
     return jsonify(released=0) 

也就是说,当counter == 10我检查车况很多次,但我想运行#code只有一次(第一次counter == 10和会话变量是0)。

编辑:检查日志时,session['info_released']变为1时counter == 10,但在随后的通话中值重新设置为0:事实上,#code运行多次,直到counter得到增加。

我不明白我做错了什么。我可能也会更好地组织程序流程,但我认为它与我遇到的问题无关。

编辑:看来,我所做的关于get_actual_demand()视图函数中的会话变量的所有内容都只是“本地”。我改变了代码如下,从login()功能删除了session['info_released'] = 0

@app.route('/get_actual_demand', methods=['GET', 'POST']) 
def get_actual_demand(): 
    # the variable session['info_released'] is no more 
    # defined in the login() function 

    if request.json['counter'] == 10: 
     try: 
      # The first time I get here, raise a KeyError exception 
      if session['info_released'] == 1: 
       return jsonify(released=0) 
     except KeyError: 
      # Use `session['info_released']` as a flag, 
      # defined here 
      session['info_released'] = 1 
      return jsonify(released=1) 
    else: 
     return jsonify(released=0) 

检查日志(从代码中删除),我可以看到所定义的会话变量时,第一次碰到异常,但随后命中再次异常就像会话变量仍然不存在一样。

我认为在我的配置中缺少一些东西,但我在文档中找不到提示。我的config.py如下:

import os 
basedir = os.path.abspath(os.path.dirname(__file__)) 


class Config(object): 
    DEBUG = False 
    TESTING = False 
    CSRF_ENABLED = True 
    WTF_CSRF_ENABLED = True 
    SECRET_KEY = 'oqEr[]*[email protected]#11!&$fsa%(Mn21eq' 
    SQLALCHEMY_MIGRATE_REPO = os.path.join(basedir, 'db_repository') 

class DevelopmentConfig(Config): 
    DEVELOPMENT = True 
    DEBUG = True 
    SQLALCHEMY_DATABASE_URI ='postgresql+psycopg2://libra:[email protected]/mydb' 
+0

你确定你的计数器是10,你在哪里存储你的计数器变量。这也是一个会话变量,或者你正在使用某种外部缓存? – Boris

+0

你可以尝试在if语句之后添加一行'import pdb; pdb.set_trace()'吗?这将在您的本地服务器正在运行的控制台中打开一个调试器。在那里你可以检查所有变量的值 – shreyas

+0

代码的第二部分在哪里?我认为你需要展示这两个片段是如何相关的。他们在相同的视图功能或不同? – Miguel

回答

1

我有同样的问题,我用Flask-Session扩展来解决它,它增加了对你的应用程序的服务器端会话的支持。 这里是网址:

http://pythonhosted.org/Flask-Session/

我加入了下一行到我的应用程序:

from flask import Flask, session 
from flask.ext.session import Session 

app = Flask(__name__) 
SESSION_TYPE = 'filesystem' 
app.config.from_object(__name__) 
Session(app) 

,这一切。不需要密钥。

希望这会有所帮助。