1. ホーム
  2. python

[解決済み] シンプルなHTTPサーバでアクセス制御を有効にする

2022-05-10 04:39:53

質問

私は、非常に単純なHTTPサーバのための以下のシェルスクリプトを持っています。

#!/bin/sh

echo "Serving at http://localhost:3000"
python -m SimpleHTTPServer 3000

私は、どのようにすれば を有効にしたり、CORS ヘッダ のように Access-Control-Allow-Origin: * のようなCORヘッダをこのサーバに送信しますか?

どのように解決するのですか?

残念ながら、シンプルな HTTP サーバーは本当にシンプルなので、特に送信するヘッダーについてはカスタマイズすることができません。しかし、シンプルな HTTP サーバーを自分で作成することは可能で、ほとんどの SimpleHTTPRequestHandler のほとんどを使って、自分でシンプルな HTTP サーバを作成し、必要なヘッダを追加するだけです。

そのためには、単にファイル simple-cors-http-server.py (または何でも)を作成し、使用しているPythonのバージョンに応じて、次のコードのいずれかを内部に記述します。

そうすると、あなたは python simple-cors-http-server.py を実行すると、変更したサーバーが起動し、すべてのレスポンスにCORSヘッダが設定されます。

を使用すると シバング で、ファイルを実行可能にして PATH に入れれば、あとは simple-cors-http-server.py を使って実行することもできます。

Python 3 ソリューション

Python 3 は SimpleHTTPRequestHandler HTTPServer から http.server モジュール でサーバを実行します。

#!/usr/bin/env python3
from http.server import HTTPServer, SimpleHTTPRequestHandler, test
import sys

class CORSRequestHandler (SimpleHTTPRequestHandler):
    def end_headers (self):
        self.send_header('Access-Control-Allow-Origin', '*')
        SimpleHTTPRequestHandler.end_headers(self)

if __name__ == '__main__':
    test(CORSRequestHandler, HTTPServer, port=int(sys.argv[1]) if len(sys.argv) > 1 else 8000)

Python 2ソリューション

Python 2は SimpleHTTPServer.SimpleHTTPRequestHandler となっており BaseHTTPServer モジュール でサーバを実行します。

#!/usr/bin/env python2
from SimpleHTTPServer import SimpleHTTPRequestHandler
import BaseHTTPServer

class CORSRequestHandler (SimpleHTTPRequestHandler):
    def end_headers (self):
        self.send_header('Access-Control-Allow-Origin', '*')
        SimpleHTTPRequestHandler.end_headers(self)

if __name__ == '__main__':
    BaseHTTPServer.test(CORSRequestHandler, BaseHTTPServer.HTTPServer)

Python 2 & 3 ソリューション

Python 3とPython 2の両方の互換性が必要な場合、両方のバージョンで動作するこのポリグロットスクリプトを使用することができます。これは最初にPython 3の場所からインポートしようとし、それ以外はPython 2にフォールバックします。

#!/usr/bin/env python
try:
    # Python 3
    from http.server import HTTPServer, SimpleHTTPRequestHandler, test as test_orig
    import sys
    def test (*args):
        test_orig(*args, port=int(sys.argv[1]) if len(sys.argv) > 1 else 8000)
except ImportError: # Python 2
    from BaseHTTPServer import HTTPServer, test
    from SimpleHTTPServer import SimpleHTTPRequestHandler

class CORSRequestHandler (SimpleHTTPRequestHandler):
    def end_headers (self):
        self.send_header('Access-Control-Allow-Origin', '*')
        SimpleHTTPRequestHandler.end_headers(self)

if __name__ == '__main__':
    test(CORSRequestHandler, HTTPServer)