当运行 CherryPy 应用程序时,它会发送类似于 CherryPy/version 的服务器名称标签。是否可以在不修改 CherryPy 的情况下从应用程序重命名/覆盖它,以便显示其他内容?
也许像 MyAppName/version (CherryPy/version)
当运行 CherryPy 应用程序时,它会发送类似于 CherryPy/version 的服务器名称标签。是否可以在不修改 CherryPy 的情况下从应用程序重命名/覆盖它,以便显示其他内容?
也许像 MyAppName/version (CherryPy/version)
现在可以在配置文件/dict 中针对每个应用程序进行设置
[/]
response.headers.server = "CherryPy Dev01"
实际上在他们的官方频道 fumanchu 上询问 IRC 给了我一个更干净的方法来做到这一点(使用最新的 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())
这个字符串似乎是在 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响应对象文档:
标题
包含响应标头的字典。您可以在 finalize 阶段之前随时在此 dict 中设置值,之后 CherryPy 切换到使用 header_list ...
编辑:为避免需要对您创建的每个响应对象进行此更改,解决此问题的一种简单方法是包装 Response 对象。例如,您可以创建自己的 Response 对象,该对象继承自 CherryPy 的 Response 并在初始化后更新 headers 键:
class MyResponse(Response):
def __init__(self):
Response.__init__(self)
dict.update(self.headers, {
"Server": "MyServer/1.0",
})
RespObject = MyResponse()
print RespObject.headers["Server"]
然后,您可以在需要创建响应对象的地方调用您的对象,并且它将始终将 Server 标头设置为您想要的字符串。