CherryPy服务器名称标签

时间:2008-09-25 19:08:28

标签: cherrypy

运行CherryPy应用程序时,它会发送类似CherryPy / version的服务器名称标签。 是否可以在不修改CherryPy的情况下从应用程序重命名/覆盖它,以便显示其他内容?

可能像MyAppName / version(CherryPy / version)

3 个答案:

答案 0 :(得分:10)

现在可以在配置文件/ dict

中基于每个应用程序进行设置
[/]  
response.headers.server = "CherryPy Dev01"

答案 1 :(得分: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())

答案 2 :(得分: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

  

     

包含响应标头的字典。您可以在中设置值   这个词典在结束阶段之前的任何时间,之后CherryPy切换   使用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标头设置为您想要的字符串。