gpt4 book ai didi

python - 相同域、不同端口的 CherryPy session

转载 作者:太空狗 更新时间:2023-10-30 03:07:53 25 4
gpt4 key购买 nike

考虑下面的脚本。它将启动两个子进程,每个子进程都是一个 CherryPy 应用程序(按 Ctrl+C 或系统上的任何 KeyboardInterrupt 组合键来结束它们)。如果您使用 CP 3.0 运行它(注意更改“StartServer”中的 3.0/3.1 特定行),则访问:

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 中。

您可以尝试各种各样的事情:更改为文件存储、分离存储路径……唯一的区别是 session 可能会被合并而不是被删除。我读过 another post关于这一点,还有一个建议是将 session 工具配置键放在应用程序配置中而不是全局配置中,但我认为这与应用程序独立运行的这种用法无关。

如何让独立的 CherryPy 应用程序不相互干扰?

注意:我最初是在 CherryPy mailing list 上问这个问题的但还没有得到回应,所以我在这里尝试。我希望没关系。

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)

最佳答案

存储 session 标识符的 cookie 绑定(bind)到主机,而不是主机+端口。当您访问第一个站点时,您将获得新的 session ID 在 3.1 中(但在 3.0 中不是),然后您填充 session 数据并可以看到它。之后你用这个session id转到其他端口,但现在它是无效的(我相信你可以在 Debug模式下的日志中看到这一点)。所以服务器向您发送新的 session ID。现在你回到第一台服务器,你的标识符再次无效,所以你得到一个新的。当然,这个新标识符的 session 中没有数据。

更新:RFC 2109,第 4.3.1 节解释 Set-Cookie 说:

The user agent keeps separate track of state information that arrives via Set-Cookie response headers from each origin server (as distinguished by name or IP address and port).

但是标准的解释并不是那么明显。这是相关 ticket 的引用在 Firefox 跟踪器中:

There are two RFC for cookies, 2109 (For set-cookie) and 2965 (For set-cookie2)

In RFC 2109 in section 4.3.1 Interpreting Set-Cookie it states
"Domain Defaults to the request-host. " And in section 2 TERMINOLOGY it states "The terms request-host and request-URI refer to the values the client would send to the server as, respectively, the host (but not port) and abs_path portions of the absoluteURI (http_URL) of the HTTP request line. Note that request-host must be a FQHN." In RFC 2965 in section 3.3.1 Interpreting Set-Cookie2 it states "Domain Defaults to the effective request-host. " it also states " Port The default behavior is that a cookie MAY be returned to any request-port. " And in section 1 TERMINOLOGY it states " The terms request-host and request-URI refer to the values the client would send to the server as, respectively, the host (but not port) and abs_path portions of the absoluteURI (http_URL) of the HTTP request line. " (Just like RFC 2109)

My interpretation of these is that port numbers should not be used for recording cookie domains unless a set-cookie2 header explicitly defines port number.

关于python - 相同域、不同端口的 CherryPy session ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2597024/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com