【问题标题】:Server-side Flask sessions using Redis on Heroku在 Heroku 上使用 Redis 的服务器端 Flask 会话
【发布时间】:2019-04-05 08:21:28
【问题描述】:

我正在 Heroku 上部署一个 Flask 应用程序,由于各种原因需要实现服务器端会话,但我不知道如何正确设置它。 Heroku 的 docs 关于如何连接非常简约:

import os
import redis

r = redis.from_url(os.environ.get("REDIS_URL"))

我正在尝试使用Flask-Session extension 来运行它。根据他们的快速入门示例:

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

app = Flask(__name__)
# Check Configuration section for more details
SESSION_TYPE = 'redis'
app.config.from_object(__name__)
Session(app)

@app.route('/set/')
def set():
    session['key'] = 'value'
    return 'ok'

我对两者的连接方式感到困惑,因为在后一个示例中甚至没有导入 redis 模块。在 Flask-session 页面上进一步阅读,有一个“扩展也理解的配置键列表:”表,其中一个是“SESSION_REDIS”,描述为“A redis.Redis例如,默认连接到 127.0.0.1:6379"。我猜这是 Heroku 文档中的实例 (r),但是“扩展理解的键”这句话让我不知道如何处理它。

【问题讨论】:

    标签: heroku flask redis


    【解决方案1】:

    是的,Flask-session 的文档记录非常糟糕。 扩展理解的键意味着您可以指定列出的配置选项,将它们传递给您的烧瓶应用程序,Flask-session 将确认并使用这些选项。之所以称为键,是因为烧瓶应用程序接受键值字典形式的配置。

    在 Flask-session 中,他们使用非常不寻常的方法来配置它:不是将主机、端口等选项作为字符串传递,而是要求您传递已配置的 redis 客户端对象:

    from flask import Flask, session
    from flask_session import Session
    from redis import Redis
    
    app = Flask(__name__)
    SESSION_TYPE = 'redis'
    SESSION_REDIS = Redis(host="your_host", port=1234)
    app.config.from_object(__name__)
    Session(app)
    

    【讨论】:

    • 好的,所以当我调用 app.config.from_object(name) 时,它会自动从文档的左列(例如 SESSION_REDIS)中查找变量名称并使用它们?
    • 我想它看起来在Session(app) 步骤中。在app.config.from_object(name) 步骤中,它从对象加载配置(__name__ 指向当前的python 模块)并将其值绑定到app 对象。
    • 好的,谢谢。不确定我是否遗漏了一些东西,但这似乎是一种非常奇怪和混乱的方式,而不是仅仅明确地传递相关参数。你知道这个选择是否有充分的理由吗?
    • 好吧,you can pass relevant arguments explicitly。但是在 Flask-session 文档中,他们选择了一种最隐含(但非常方便)的方式来设置示例中的设置,这不是一个好的选择,因为它需要非常了解烧瓶配置的工作原理。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-14
    • 1970-01-01
    • 2019-01-10
    • 2013-11-14
    • 2012-09-25
    • 1970-01-01
    相关资源
    最近更新 更多