【问题标题】:Change session variable value fails更改会话变量值失败
【发布时间】: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)的函数,并从数据库中获取。还有另一个函数可以定期递增数据库中的变量。

标签: python session flask


【解决方案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)

仅此而已。不需要密钥。

希望这会有所帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-10
    • 1970-01-01
    • 2016-08-29
    • 2016-11-26
    • 2016-09-16
    • 2023-03-21
    相关资源
    最近更新 更多