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

时间:2017-08-03 05:59:24

标签: python apache session flask wsgi

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

在同一个apache服务器上运行有2个不同的应用程序:
In [2]: timeit ts.distribution( start=date_parse('2012-01-01'), end=date_parse('2013-01-01') ) 619 µs ± 7.25 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
www.example.com/lodge

这两个应用都有一个独特的www.example.com/dashboard

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

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

我遇到的问题是,如果我导航到personal并登录,我可以在工作人员和订单路线之间轻弹没有任何问题,但是当我打开一个新标签然后转到{{ 1}}(然后调用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> 上的小屋应用

,则不会发生这种情况

3 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:1)

  

旁注,如果我访问http://example.com/dashboard上的信息中心应用以及http://www.example.com/lodge上的小屋应用

,则不会发生这种情况

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

example.com设置Cookie后,该Cookie适用于该域的所有链接,路径和网址。对www.example.com 有效 - 这解释了如果您在其他子域上运行某个应用程序,它的工作原理。

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

答案 2 :(得分: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的回答提供了对问题的一些见解,所以非常感谢!
拥有多个子域名对我来说不是一个选项,当我们在他们自己的虚拟环境中运行这两个应用程序时,我遇到了同样的问题。