Вопрос
При запуске приложения CherryPy оно отправит тег имени сервера, например CherryPy/version.Можно ли переименовать/перезаписать это из приложения, не изменяя CherryPy, чтобы оно показывало что-то еще?
Может быть, что-то вроде MyAppName/версия (CherryPy/версия)
Решение 2
На самом деле вопрос в 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())
Другие советы
Теперь это можно установить для каждого приложения в файле конфигурации/dict.
[/]
response.headers.server = "CherryPy Dev01"
Похоже, эта строка устанавливается в файле CherrPy. Ответ сорт:
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, вы можете обновить заголовок «Сервер», чтобы отобразить нужную строку.Из CherrPy Документация по объекту ответа:
заголовки
Словарь, содержащий заголовки ответа.Вы можете установить значения в этом DICT в любое время перед фазой завершения, после чего вишневый переключается на использование header_list ...
РЕДАКТИРОВАТЬ:Чтобы избежать необходимости вносить это изменение в каждый создаваемый вами объект ответа, есть простой способ обойти это — обернуть объект Response.Например, вы можете создать свой собственный объект Response, который наследуется от Response CherryPy и обновляет ключ заголовков после инициализации:
class MyResponse(Response):
def __init__(self):
Response.__init__(self)
dict.update(self.headers, {
"Server": "MyServer/1.0",
})
RespObject = MyResponse()
print RespObject.headers["Server"]
Затем вы можете вызвать свой объект для случаев, когда вам нужно создать объект Response, и в заголовке сервера всегда будет установлена нужная строка.