SimpleHTTPServer
作業中のいくつかのWebページをテストするために使用しています。それはうまく機能しますが、私はいくつかのクロスドメインリクエストを行う必要があります。そのためAccess-Control-Allow-Origin
には、ページがアクセスを許可されているドメインでヘッダーを設定する必要があります。
SimpleHTTPServerでヘッダーを設定し、元のコンテンツを提供する簡単な方法はありますか?ヘッダーは各リクエストで同じになります。
SimpleHTTPServer
作業中のいくつかのWebページをテストするために使用しています。それはうまく機能しますが、私はいくつかのクロスドメインリクエストを行う必要があります。そのためAccess-Control-Allow-Origin
には、ページがアクセスを許可されているドメインでヘッダーを設定する必要があります。
SimpleHTTPServerでヘッダーを設定し、元のコンテンツを提供する簡単な方法はありますか?ヘッダーは各リクエストで同じになります。
これは動作を変えるので少しハックですが、ファイル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)
簡単な方法はないと思いますが、簡単な方法とは、「追加のヘッダーを書き込み、既存の機能を維持する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
...
# 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()