【问题标题】:Multiple Python Flask apps on single apache server losing sessions when session.clear is called on one of the apps当在其中一个应用程序上调用 session.clear 时,单个 apache 服务器上的多个 Python Flask 应用程序会丢失会话
【发布时间】:2018-01-10 13:46:12
【问题描述】:

我有几个使用 WSGI 在我的 apache 服务器上运行的 python 3.6 Flask 应用程序。

有 2 个不同的应用程序在同一个 apache 服务器上运行:
www.example.com/lodge
www.example.com/dashboard

两个应用都有一个独特的app.secret_key

/dashboard 应用程序是一个烧瓶应用程序,具有自己的一组路由:
/dashboard/login
/dashboard/orders
/dashboard/staff
登录路由调用session.clear() 并让用户输入他们的登录信息。然后,登录的令牌会存储在会话变量中。
/dashboard/ordersdashboard/staff 路由都有一个装饰器,用于检查会话中登录令牌是否存在,如果不存在则重定向到登录路由。

/lodge 应用程序是另一个简单的 Flask 应用程序,具有自己的路由:
/lodge/welcome
/lodge/personal
/lodge/review
/lodge/confirmation
欢迎路线还调用session.clear(),然后显示一个网络表单。当用户提交 webform 时,personal 路由被调用,它将这些 webform 输入值存储到会话中。

我遇到的问题是,如果我导航到www.example.com/dashboard/login 并登录,然后我可以在员工和订单路线之间轻弹完全没有问题,但是当我打开一个新标签并转到www.example.com/lodge/welcome 时(然后调用session.clear)然后重新打开仪表板选项卡并尝试转到员工或订单路线,因为会话已被清除,我被重定向回登录路线。

httpd.conf:

<VirtualHost *:80>
    WSGIScriptAlias /newapp "c:/lodge/lodge.wsgi"
    <Directory "c:/lodge">
        Require all granted
    </Directory>

    WSGIScriptAlias /dashboard "c:/dashboard/dashboard.wsgi"
    <Directory "c:/dashboard">
       Require all granted
    </Directory>
</VirtualHost>

旁注,如果我访问http://example.com/dashboard 上的仪表板应用程序和http://www.example.com/lodge 上的旅馆应用程序,则不会发生这种情况

【问题讨论】:

    标签: python apache session flask wsgi


    【解决方案1】:

    在这里回答我自己的问题。

    通过更改两个应用程序的应用程序配置,我很容易在同一个 apache 服务器上实现了多个应用程序。无需虚拟环境或修改 wsgi 脚本!

    旅馆应用程序:

    app = Flask(__name__)
    app.config.from_object(__name__)
    
    app.config.update(
        SESSION_COOKIE_NAME = 'session_lodge',
        SESSION_COOKIE_PATH = '/lodge/'
    )
    

    仪表板应用:

    app = Flask(__name__)
    app.config.from_object(__name__)
    
    app.config.update(
        SESSION_COOKIE_NAME = 'session_db',
        SESSION_COOKIE_PATH = '/dashboard/'
    )
    

    @m-dennis 和 @burhan-khalid 的回答对这个问题提供了一些见解,非常感谢!
    拥有多个子域对我来说不是一个选项,当两个应用程序在各自的虚拟环境中运行时,我遇到了同样的问题。

    【讨论】:

      【解决方案2】:

      旁注,如果我访问http://example.com/dashboard 上的仪表板应用程序和http://www.example.com/lodge 上的小屋应用程序,则不会发生这种情况

      这实际上是您看到这种行为的原因。 Cookie 绑定到,而不是路径

      example.com 设置 cookie 后,它对该域的所有链接、路径和 URL 均有效。它无效www.example.com 有效 - 这解释了为什么如果您在不同的子域上运行您的应用程序之一它会起作用。

      所以你看到的是正确的行为。

      【讨论】:

      • 啊,我明白了。您对如何解决问题有什么建议吗?
      • 你已经通过在不同的子域(www.example.com 与 example.com)上托管应用程序来解决它
      【解决方案3】:

      尝试使用虚拟环境。似乎您的烧瓶应用程序在一个 python 执行线程中运行。 Here 你可以找到,如何在虚拟环境中运行你的应用程序。

      【讨论】:

      • 我从您提供的链接中复制了示例,并更新了我的 wsgi 文件以包含 python 3 示例中的三行,并将 activate_this 变量更改为指向我的 py 文件。即:activate_this = 'c:/lodge/lodge.py'activate_this = 'c:/dashboard/dashboard.py',但是我现在在启动时的 wsgi 文件中出现错误,说模块 ModuleNotFoundError: No module named 'fnc'(fnc 是每个应用程序的父目录中的一个 python 文件,其中包含函数 defs) .有任何想法吗?谢谢!
      • activate_this 必须在您的虚拟环境中指向bin/activate_this.py。您应该为您的应用使用不同的环境。
      猜你喜欢
      • 1970-01-01
      • 2012-02-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多