【问题标题】:CherryPy server name tagCherryPy 服务器名称标签
【发布时间】:2010-09-13 05:08:45
【问题描述】:

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

可能类似于 MyAppName/version (CherryPy/version)

【问题讨论】:

    标签: cherrypy


    【解决方案1】:

    现在可以在配置文件/dict 中针对每个应用程序进行设置

    [/]  
    response.headers.server = "CherryPy Dev01"
    

    【讨论】:

      【解决方案2】:

      实际上,在他们的官方频道 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())
      

      【讨论】:

      • 嗯,那是在 2008 年,在这个版本中,我认为你应该去他们的 irc 频道询问,我相信有人会提供帮助。当时我问了主开发,他是一个非常好的人,我相信他会帮助你。
      【解决方案3】:

      这个字符串似乎是在 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

      标题

      包含响应标头的字典。您可以在 这个 dict 在 finalize 阶段之前的任何时候,之后 CherryPy 切换 使用 header_list ...

      编辑:为避免需要对您创建的每个响应对象进行此更改,解决此问题的一种简单方法是包装响应对象。例如,您可以创建自己的 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 标头设置为您想要的字符串。

      【讨论】:

      • 如果我将它设置在我的根类的 init 中它不起作用。 cherrypy.response.headers["Server"]="app/0.1(CherryPy/"+cherrypy.__version__+")" 如果我​​在每种方法(索引、foopage 等)中设置它,它可以工作,但写起来很痛苦在每个方法中是否可以全局制作,以便在所有页面上工作?
      • 全局执行此操作的最简单方法可能是包装 Response 对象本身。我会用一个例子来更新帖子。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-03-02
      • 2011-01-13
      • 2011-08-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多