Рассмотрим скрипт ниже. Он запустит два подпроцесса, каждый из которых представляет собой приложение CherryPy (нажмите Ctrl + C или любую комбинацию KeyboardInterrupt в вашей системе, чтобы завершить их оба). Если вы запускаете его с CP 3.0 (стараясь изменить определенные строки 3.0 / 3.1 в «StartServer»), тогда посетите:
http://localhost:15002/
... вы видите пустой диктант. Тогда посетите:
http://localhost:15002/set?val=10
http://localhost:15002/
... и вы видите недавно населенный диктат. Тогда посетите:
http://localhost:15012/
... и вернитесь к
http://localhost:15002/
... и ничего не изменилось.
Если вы попробуете то же самое с 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)