質問

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 オブジェクトを作成するときに、「Server」ヘッダーを更新して目的の文字列を表示できます。チェルピーより 応答オブジェクトのドキュメント:

ヘッダー

応答のヘッダーを含む辞書。ファイナライズフェーズの前にいつでもこのDICTの値を設定できます。その後、Cherrypyはheader_listを使用するように切り替えます...

編集:作成する応答オブジェクトごとにこの変更を加える必要がないようにするには、これを回避する簡単な方法の 1 つは、Response オブジェクトをラップすることです。たとえば、CherryPy の Response を継承し、初期化後にヘッダー キーを更新する独自の 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 ヘッダーが目的の文字列に設定されます。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top