【问题标题】:GAE Flask global variable persistent across browsers [duplicate]GAE Flask全局变量在浏览器中持久[重复]
【发布时间】:2016-09-09 15:08:44
【问题描述】:

这是我的 Flask 设置:

main.py

from flask import Flask
from app.views import main_bp

app = Flask(__name__)
app.register_blueprint(main_bp, url_prefix='')

app.config.py(本例用“...”缩写)

CONFIG = {
    'SITE_NAME': 'Test Site',
    'SSL': False,
    'DEBUG': True,
    'LOGGED_IN': False,
    ...
}

views.py

from config import CONFIG

@main_bp.route('/')
@main_bp.route('/<page_slug>/')
def fallback(page_slug='home'):
    # Check if logged in
    if CONFIG['LOGGED_IN']:
        return 'Logged In'
    else
        return 'Logged Out'

现在,如果我在其中一个浏览器(比如 Google Chrome)中将 CONFIG['LOGGED_IN'] 更改为 True,然后打开另一个浏览器访问该网站(比如 Firefox),那么我已经在这两个浏览器上都登录了。如果我随后退出 Firefox 并刷新 Chrome,我将同时退出。

当我使用 Django 时,我从未注意到这样的问题……我的全局 CONFIG 变量在浏览器中持续存在。奇怪!

我需要把我的 CONFIG 变成一个类吗?也许这只会在通过 dev_appserver.py 运行时发生,而不会在生产中发生?我还在学习,所以请多多关照!谢谢:)

注意:请忽略此示例中明显的安全问题。我向你保证,这不是我打算使用此代码的方式。

【问题讨论】:

    标签: python google-app-engine flask


    【解决方案1】:

    正如大卫主义指出的那样,我不应该将每个会话更改的变量存储为全局变量。我将在加载相关的会话变量(如 UID 和会话 ID)后决定这些变量。

    谢谢。

    更新:不过,我觉得有趣的是 Flask 文档会提倡通过 g 设置全局变量(请参阅:http://flask.pocoo.org/docs/0.11/api/

    【讨论】: