【问题标题】:Flask redis server session: Error in save_sessionFlask redis 服务器会话:save_session 中的错误
【发布时间】:2017-04-02 04:00:14
【问题描述】:

人们: 我正在将带有 redis 的 Flask 应用程序用于会话存储到 docker 容器中。当 redis 在本地运行时,我的应用程序运行愉快。但是,当使用 redis 映像运行 docker-compose 时,我看到以下错误。无论我的 redis 容器是运行还是停止,我都会收到相同的错误:

2017-04-02 03:36:09,861] ERROR in app: Exception on / [GET]
web_1    | Traceback (most recent call last):
web_1    |   File "/usr/local/lib/python2.7/site-packages/flask/app.py", line 1988, in wsgi_app
web_1    |     response = self.full_dispatch_request()
web_1    |   File "/usr/local/lib/python2.7/site-packages/flask/app.py", line 1643, in full_dispatch_request
web_1    |     response = self.process_response(response)
web_1    |   File "/usr/local/lib/python2.7/site-packages/flask/app.py", line 1864, in process_response
web_1    |     self.save_session(ctx.session, response)
web_1    |   File "/usr/local/lib/python2.7/site-packages/flask/app.py", line 926, in save_session
web_1    |     return self.session_interface.save_session(self, session, response)
web_1    |   File "/usr/local/lib/python2.7/site-packages/flask_session/sessions.py", line 165, in save_session
web_1    |     self.redis.setex(name=self.key_prefix + session.sid, value=val,
web_1    | AttributeError: 'str' object has no attribute 'setex'

我已将以下配置属性添加到我的应用程序以进行会话配置:

SESSION_TYPE = "redis"
SESSION_REDIS = "redis:6379"

我不认为这是 docker-compose 问题,因为我的应用程序能够成功连接到 MySQL 实例,但这里是我的 docker-compose.yml 文件,以防它指向某些东西:

version: "3"
services:
  mysql:
    build:
      context: db/
  web:
    build:
      context: web/
    ports:
    - "10080:80"
    depends_on:
    - "mysql"
    - "redis"
  redis:
    image: "redis:alpine"

【问题讨论】:

    标签: session flask redis docker-compose


    【解决方案1】:

    想通了。问题出在会话配置中。我不得不改变

    SESSION_REDIS = "redis:6379"
    

    SESSION_REDIS = redis.Redis("redis")
    

    【讨论】:

    • 还要保持接受你的答案的习惯,而不是让它为 Stackoverflow 开放。
    • 嗨@LuFFy,只是为了确认一下,推荐的做法是接受我的答案而不是保持打开状态?看来我必须再等 8 个小时才能接受我自己的答案,所以到时候我会试试的。
    • 我现在遇到了这个问题,您需要明确通知默认主机和服务器以解决“问题” - 'SESSION_REDIS': redis.Redis(host='localhost', port=6379),
    【解决方案2】:

    这对我有用:

    from flask import Flask, session
    from flask_session import Session
    import redis
    
    app = Flask(__name__)
    
    # Load the config file
    app.config.from_pyfile('config.cfg')
    
    # Create and initialize the Flask-Session object 
    app.config['SESSION_REDIS'] = redis.from_url(app.config['REDIS_URL'])
    server_session = Session(app)
    

    config.cfg

    REDIS_URL = 'redis://:p1ba23....'
    

    【讨论】:

      猜你喜欢
      • 2019-04-05
      • 2023-03-14
      • 2013-08-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-10-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多