58

SimpleHTTPServer作業中のいくつかのWebページをテストするために使用しています。それはうまく機能しますが、私はいくつかのクロスドメインリクエストを行う必要があります。そのためAccess-Control-Allow-Originには、ページがアクセスを許可されているドメインでヘッダーを設定する必要があります。

SimpleHTTPServerでヘッダーを設定し、元のコンテンツを提供する簡単な方法はありますか?ヘッダーは各リクエストで同じになります。

4

4 に答える 4

56

これは動作を変えるので少しハックですが、ファイルend_headers()全体をコピーして貼り付けるよりも少し良いと思いSimpleHTTPServer.pyます。

end_headers()私のアプローチは、サブクラスでオーバーライドし、その中でsend_my_headers()スーパークラスのを呼び出した後に呼び出しend_headers()ます。

1〜2行でもありませんが、20行未満です。主に定型文。

#!/usr/bin/env python
try:
    from http import server # Python 3
except ImportError:
    import SimpleHTTPServer as server # Python 2

class MyHTTPRequestHandler(server.SimpleHTTPRequestHandler):
    def end_headers(self):
        self.send_my_headers()

        server.SimpleHTTPRequestHandler.end_headers(self)

    def send_my_headers(self):
        self.send_header("Access-Control-Allow-Origin", "*")


if __name__ == '__main__':
    server.test(HandlerClass=MyHTTPRequestHandler)
于 2012-11-13T01:42:37.027 に答える
10

簡単な方法はないと思いますが、簡単な方法とは、「追加のヘッダーを書き込み、既存の機能を維持する1〜2行を追加するだけ」という意味です。したがって、最善の解決策は、SimpleHTTPRequestHandlerクラスをサブクラス化し、新しいヘッダーを追加して機能を再実装することです。

これを行う簡単な方法がない理由の背後にある問題はSimpleHTTPRequestHandler、Python ライブラリのクラスの実装を調べることで確認できます: http://hg.python.org/cpython/file/19c74cadea95/Lib/http/server. py#l654

send_head()メソッド、特に応答ヘッダーを送信するメソッドの最後の行に注目してください。end_headers()メソッドの呼び出しに注目してください。このメソッドは、すべてのヘッダーの終わりと応答本文の開始を示す空白行とともにヘッダーを出力に書き込みます: http://docs.python.org/py3k/library/http.server.html#http .server.BaseHTTPRequestHandler.end_headers

SimpleHTTPRequestHandlerしたがって、ハンドラをサブクラス化し、スーパークラス メソッドを呼び出してから別のヘッダーを追加することはできません。これは、スーパークラス メソッドへの呼び出しが返さdo_GET()れたときにヘッダーの送信が既に終了しているためです。メソッドは本文 (要求されたファイル) を送信する必要があり、本文を送信するには、ヘッダーの送信を終了する必要があるdo_GET()ため、このように動作する必要があります。do_GET()

繰り返しになりますが、クラスをサブクラス化SimpleHTTPRequestHandlerし、ライブラリ内のコードとまったく同じように実装し (コピーして貼り付けるだけですか?)、end_headers()メソッドの呼び出しの前に別​​のヘッダーを追加することに固執していると思いsend_head()ます。

...
self.send_header("Last-Modified", self.date_time_string(fs.st_mtime))
# this below is the new header
self.send_header('Access-Control-Allow-Origin', '*')
self.end_headers()
return f
...
于 2012-09-19T17:15:00.643 に答える
4
# coding: utf-8
import SimpleHTTPServer
import SocketServer
PORT = 9999

def do_GET(self):
    self.send_response(200)
    self.send_header('Access-Control-Allow-Origin', 'http://example.com')           
    self.end_headers()

Handler = SimpleHTTPServer.SimpleHTTPRequestHandler
Handler.do_GET = do_GET
httpd = SocketServer.TCPServer(("", PORT), Handler)
httpd.serve_forever()
于 2012-09-19T16:52:24.950 に答える