CherryPy服务器名称标签
时间:2020-03-06 14:44:32 来源:igfitidea点击:
运行CherryPy应用程序时,它将发送服务器名称标签,例如CherryPy / version。
是否可以在不修改CherryPy的情况下从应用程序重命名/覆盖它,以便显示其他内容?
也许像MyAppName / version(CherryPy / version)之类的东西
解决方案
该字符串似乎是在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文档中:
headers A dictionary containing the headers of the response. You may set values in this dict anytime before the finalize phase, after which CherryPy switches to using header_list ...
编辑:为避免需要对我们创建的每个响应对象进行此更改,一种解决此问题的简单方法是包装Response对象。例如,我们可以创建自己的Response对象,该对象继承自CherryPy的Response,并在初始化后更新标头键:
class MyResponse(Response): def __init__(self): Response.__init__(self) dict.update(self.headers, { "Server": "MyServer/1.0", }) RespObject = MyResponse() print RespObject.headers["Server"]
然后,我们可以调用对象以用于需要创建Response对象的用途,并且该对象始终将Server标头设置为所需的字符串。
实际上在官方频道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())