CherryPy服务器名称标签

7
在运行CherryPy应用时,它会发送一个服务器名称标签,类似于CherryPy/version。是否可以从应用程序中重命名/覆盖该标签,而无需修改CherryPy,以便显示其他内容?也许像MyAppName/version (CherryPy/version) 这样的内容。
3个回答

10
现在可以在配置文件/字典中按应用程序设置此选项。
[/]  
response.headers.server = "CherryPy Dev01"

5

实际上,在官方 IRC 频道上询问 fumanchu,他给了我一个更加简洁的方法来解决这个问题(使用最新的 SVN):

import cherrypy
from cherrypy import _cpwsgi_server 
class HelloWorld(object):
    def index(self):
        return "Hello World!"
    index.exposed = True

serverTag = "MyApp/%s (CherryPy/%s)" % ("1.2.3", cherrypy.__version__)
_cpwsgi_server.CPWSGIServer.environ['SERVER_SOFTWARE'] = serverTag
cherrypy.config.update({'tools.response_headers.on': True,
                        'tools.response_headers.headers': [('Server', serverTag)]})
cherrypy.quickstart(HelloWorld())

那是在2008年的事了,在这个版本中,我认为你应该去他们的IRC频道问问,我相信会有人帮助你。当时我问了主要的开发者,他是一个非常好的人,我相信他会帮助你的。 - daniels

4
这个字符串似乎是在CherrPy Response类中设置的:
def __init__(self):
  self.status = None
  self.header_list = None
  self._body = []
  self.time = time.time()

  self.headers = http.HeaderMap()
  # Since we know all our keys are titled strings, we can
  # bypass HeaderMap.update and get a big speed boost.
  dict.update(self.headers, {
    "Content-Type": 'text/html',
    "Server": "CherryPy/" + cherrypy.__version__,
    "Date": http.HTTPDate(self.time),
  })

当您创建Response对象时,您可以更新“Server”标头以显示所需的字符串。来自CherrPy Response Object documentation

headers

包含响应头的字典。您可以在finalize阶段之前的任何时间设置此字典中的值,之后CherryPy将切换到使用header_list...

编辑:为了避免需要针对每个响应对象进行此更改,一种简单的方法是包装Response对象。例如,您可以创建一个继承自CherryPy Response并在初始化后更新headers键的自定义Response对象:
class MyResponse(Response):

    def __init__(self):
        Response.__init__(self)
        dict.update(self.headers, {
            "Server": "MyServer/1.0",
        })

RespObject = MyResponse()
print RespObject.headers["Server"]

然后,当你需要创建一个响应对象时,你可以调用你的对象,并且它将始终将服务器头设置为你想要的字符串。

如果我在根类的__init__中设置它,它不起作用。 cherrypy.response.headers["Server"]="app/0.1(CherryPy/"+cherrypy.version+")"如果我在每个方法(index、foopage等)中设置它,它可以工作,但是在每个方法中都写这个很麻烦。 能否全局设置,使其在所有页面上都有效? - daniels
最简单的全局方法可能是直接包装 Response 对象本身。我会在帖子中更新一个示例。 - Jay

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接