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