【问题标题】:flask-security can't work with gunicorn with multiple workers?烧瓶安全不能与多个工人一起使用gunicorn?
【发布时间】:2017-05-24 11:35:02
【问题描述】:

我正在用Flask 编写一个网站。我使用Flask-Secuirty 进行身份验证。我使用nginx + gunicorn 来部署它。

nginx的配置如下:

server{
    listen 80;
    server_name project.example.com;
    location / {
        proxy_pass http://127.0.0.1:5000;

        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forward-For $proxy_add_x_forwarded_for;
    }
}

我使用gunicorn -w worker_number -k gevent run:app -p app.pid -b 127.0.0.1:5000 启动gunicorn

如果worker_number1,则一切正常。

如果worker_number 大于1,如3,我无法使用Flask-Security 登录。

服务器的输出说登录的post请求是200。但是服务器再次将我重定向到登录页面。

经过一番搜索,我找不到直接的原因。我猜这可能是由 Flask 的 SERVER_NAME 配置或 Flask-SQLAlchemy 的滥用引起的。

有没有人遇到过这种情况?请给我一些建议。

【问题讨论】:

    标签: python nginx flask-sqlalchemy gunicorn flask-security


    【解决方案1】:

    flask_login也遇到类似问题,worker_number大于1时,无法登录。

    我的 app.secret_key 设置为 os.urandom(24),所以每个工作人员都会有另一个密钥。

    将 app.secret_key 设置为字符串解决了我的问题。

    【讨论】:

      【解决方案2】:

      只需使用固定的密钥即可。
      使用以下命令生成。
      $ openssl rand -base64 <desired_length>

      如果您不想在源代码中对密钥进行硬编码,出于安全考虑,您不应该这样做。
      设置环境变量并获取它。

      import os
      
      # -- snip --
      
      app.config["SECRET_KEY"] = os.environ.get("FLASK_APP_SECRET_KEY")
      

      【讨论】:

      • 这将是公认的答案。解决了我的问题。
      【解决方案3】:

      使用 Flask-Session 之类的东西并将 Redis 用作会话存储。我不确定 Flask-Security 是如何工作的,但我认为它依赖于 Flask 会话,在这种情况下,它可以解决用户会话在应用服务器之间切换的问题。

      【讨论】:

        猜你喜欢
        • 2018-09-12
        • 2020-12-28
        • 1970-01-01
        • 2018-05-22
        • 2017-01-17
        • 1970-01-01
        • 2019-03-10
        • 2016-03-19
        • 1970-01-01
        相关资源
        最近更新 更多