当在其中一个应用程序上调用 session.clear 时,单个 apache 服务器上的多个 Python Flask 应用程序丢失会话

Multiple Python Flask apps on single apache server losing sessions when session.clear is called on one of the apps

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

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

这两个应用程序都有唯一的 app.secret_key

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

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

我遇到的问题是,如果我导航到 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

上访问旅馆应用程序,则不会发生这种情况

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

Side note, this does not happen if I access the dashboard app on http://example.com/dashboard and the lodge app on http://www.example.com/lodge

这实际上就是您看到此行为的原因。 Cookie 绑定到 domains 而不是 paths.

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

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

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

通过更改两个应用程序的应用程序配置,我很容易地在同一个 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 的回答提供了对问题的一些见解,非常感谢!
拥有多个子域对我来说不是一个选择,当两个应用程序 运行 在它们自己的虚拟环境中时,我遇到了同样的问题。