以下のスクリプトを検討してください。2 つのサブプロセスが起動され、それぞれが 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)