【发布时间】:2015-09-30 21:59:17
【问题描述】:
编辑:实际上,我可以看到会话变量的值发生了变化,但在下一次调用该函数时,该值被设置回 0
我是 Flask 初学者,在更改会话变量的值时遇到问题。这是我的代码的摘录: 第一轮 cmets 后编辑
0) 我在我的 config.py 中设置了 SECRET_KEY 变量。
1) 当用户登录时,我设置了一个会话变量:
@app.route('/login', methods=['GET', 'POST'])
def login():
session['info_released'] = 0
app.logger.debug('info_released session value: {}'.format(session['info_released'])
...
查看日志,session变量的值正确设置为0。
2) 我有一个通过request.json 传递的counter 变量,该变量不时递增。在一个 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'] 在counter == 10 时更改为 1,但在下一次调用中该值设置回 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[]*woi+145@#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:password@localhost/mydb'
【问题讨论】:
-
你确定你的计数器是 10,你在哪里存储你的计数器变量。这也是会话变量,还是您正在使用某种外部缓存?
-
您可以尝试在
if语句之后添加行import pdb;pdb.set_trace()吗?这将在运行本地服务器的控制台中打开一个调试器。在那里你可以检查所有变量的值 -
第二个sn-p代码在哪里?我认为你需要展示这两个 sn-ps 是如何相关的。它们是相同的视图功能还是不同的?
-
@Miguel:两个sn-ps在不同的视图函数中
-
@Boris:
counter不是会话变量:它实际上被传递给包含if条件(第二个 sn-p)的函数,并从数据库中获取。还有另一个函数可以定期递增数据库中的变量。