在运行CherryPy应用时,它会发送一个服务器名称标签,类似于CherryPy/version。是否可以从应用程序中重命名/覆盖该标签,而无需修改CherryPy,以便显示其他内容?也许像MyAppName/version (CherryPy/version) 这样的内容。
[/]
response.headers.server = "CherryPy Dev01"
实际上,在官方 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())
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对象。例如,您可以创建一个继承自CherryPy Response并在初始化后更新headers键的自定义Response对象:headers
包含响应头的字典。您可以在finalize阶段之前的任何时间设置此字典中的值,之后CherryPy将切换到使用header_list...
class MyResponse(Response):
def __init__(self):
Response.__init__(self)
dict.update(self.headers, {
"Server": "MyServer/1.0",
})
RespObject = MyResponse()
print RespObject.headers["Server"]