Étiquette de nom de serveur CherryPy
-
02-07-2019 - |
Question
Lorsque vous exécutez une application CherryPy, il envoie une balise de nom de serveur du type CherryPy / version. Est-il possible de renommer / écraser cela à partir de l'application sans modifier CherryPy pour qu'il affiche autre chose?
Peut-être quelque chose comme MyAppName / version (CherryPy / version)
La solution 2
En fait, demander à IRC sur leur chaîne officielle que fumanchu m’ait donné un moyen plus propre de le faire (en utilisant le dernier 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())
Autres conseils
Ceci peut maintenant être défini application par application dans le fichier de configuration / dict
[/]
response.headers.server = "CherryPy Dev01"
Cette chaîne semble être définie dans le réponse de CherrPy. classe:
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),
})
Ainsi, lorsque vous créez votre objet Response, vous pouvez mettre à jour le " Serveur " en-tête pour afficher votre chaîne souhaitée. À partir de la documentation sur les objets de réponse de CherrPy :
en-têtes
Un dictionnaire contenant les en-têtes de la réponse. Vous pouvez définir des valeurs dans ce dict à tout moment avant la phase de finalisation, après quoi CherryPy bascule utiliser header_list ...
MODIFIER : pour éviter de devoir effectuer cette modification avec chaque objet de réponse que vous créez, un moyen simple de contourner ce problème consiste à envelopper l'objet de réponse. Par exemple, vous pouvez créer votre propre objet Response qui hérite de la réponse de CherryPy et met à jour la clé d'en-tête après l'initialisation:
class MyResponse(Response):
def __init__(self):
Response.__init__(self)
dict.update(self.headers, {
"Server": "MyServer/1.0",
})
RespObject = MyResponse()
print RespObject.headers["Server"]
Ensuite, vous pouvez appeler votre objet pour des utilisations pour lesquelles vous devez créer un objet Response. L'en-tête du serveur sera toujours défini sur la chaîne souhaitée.