考虑下面的脚本。它将启动两个子进程,每个子进程都是 CherryPy 应用程序(按 Ctrl+C 或系统上的任何 KeyboardInterrupt 组合以结束它们)。如果您使用 CP 3.0 运行它(注意更改“StartServer”中的 3.0/3.1 特定行),请访问:
...你看到一个空的字典。然后访问:
http://localhost:15002/set?val=10
...您会看到新填充的字典。然后访问:
...然后回到
……什么都没有改变。
如果您在 CP 3.1 上尝试相同的操作(请记住“StartServer”中的行!),当您到达最后一步时,dict 现在是空的。这发生在 Windows 和 Debian、Python 2.5 和 2.6 中。
您可以尝试各种各样的事情:更改为文件存储、分离存储路径……唯一的区别是会话可能会被合并而不是被删除。我也阅读了另一篇关于此的文章,并且建议将会话工具配置键放在应用程序配置而不是全局配置中,但我认为这与应用程序独立运行的这种用法无关。
我该怎么做才能让独立的 CherryPy 应用程序不相互干扰?
注意:我最初在CherryPy 邮件列表上提出了这个问题,但还没有得到回复,所以我在这里尝试。我希望没关系。
import os, os.path, socket, sys
import subprocess
import cgi
import cherrypy
HTTP_PORT = 15002
HTTP_HOST = "127.0.0.1"
site1conf = {
'global' : {
'server.socket_host' : HTTP_HOST,
'server.socket_port' : HTTP_PORT,
'tools.sessions.on' : True,
# 'tools.sessions.storage_type': 'file',
# 'tools.sessions.storage_path': '1',
# 'tools.sessions.storage_path': '.',
'tools.sessions.timeout' : 1440}}
site2conf = {
'global' : {
'server.socket_host' : HTTP_HOST,
'server.socket_port' : HTTP_PORT + 10,
'tools.sessions.on' : True,
# 'tools.sessions.storage_type': 'file',
# 'tools.sessions.storage_path': '2',
# 'tools.sessions.storage_path': '.',
'tools.sessions.timeout' : 1440}}
class Home(object) :
def __init__(self, key):
self.key = key
@cherrypy.expose
def index(self):
return """\
<html>
<body>Session:
<br>%s
</body>
</html> """ % cgi.escape(str(dict(cherrypy.session)))
@cherrypy.expose
def set(self, val):
cherrypy.session[self.key.upper()] = val
return """\
<html>
<body>Set %s to %s</body>
</html>""" % (cgi.escape(self.key), cgi.escape(val))
def StartServer(conf, key):
cherrypy.config.update(conf)
print 'Starting server (%s)' % key
cherrypy.tree.mount(Home(key), '/', {})
# Start the web server.
#### 3.0
# cherrypy.server.quickstart()
# cherrypy.engine.start()
####
#### 3.1
cherrypy.engine.start()
cherrypy.engine.block()
####
def Main():
# Start first webserver
proc1 = subprocess.Popen(
[sys.executable, os.path.abspath(__file__), "1"])
proc2 = subprocess.Popen(
[sys.executable, os.path.abspath(__file__), "2"])
proc1.wait()
proc2.wait()
if __name__ == "__main__":
print sys.argv
if len(sys.argv) == 1:
# Master process
Main()
elif(int(sys.argv[1]) == 1):
StartServer(site1conf, 'magic')
elif(int(sys.argv[1]) == 2):
StartServer(site2conf, 'science')
else:
sys.exit(1)