2015-07-12 129 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) 

,這一切。不需要密鑰。

希望這會有所幫助。