非常に単純なHTTPサーバー用の次のシェルスクリプトがあります。
#!/bin/sh
echo "Serving at http://localhost:3000"
python -m SimpleHTTPServer 3000
このサーバーにAccess-Control-Allow-Origin: *
のようなCORSヘッダーを有効化または追加する方法を疑問に思っていましたか?
残念ながら、単純なHTTPサーバーは本当に単純なので、特に送信するヘッダーはカスタマイズできません。ただし、ほとんどのSimpleHTTPRequestHandler
を使用して簡単なHTTPサーバーを自分で作成し、必要なヘッダーを追加するだけです。
そのためには、ファイルsimple-cors-http-server.py
(または何でも)を作成し、使用しているPythonバージョンに応じて、次のコードのいずれかを内部に配置します。
その後、python simple-cors-http-server.py
を実行すると、変更されたサーバーが起動され、応答ごとにCORSヘッダーが設定されます。
Shebang を先頭にして、ファイルを実行可能にしてPATHに入れると、simple-cors-http-server.py
を使用して実行することもできます。
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 __== '__main__':
test(CORSRequestHandler, HTTPServer, port=int(sys.argv[1]) if len(sys.argv) > 1 else 8000)
Python 2は SimpleHTTPServer.SimpleHTTPRequestHandler
と BaseHTTPServer
module を使用してサーバーを実行します。
#!/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 __== '__main__':
BaseHTTPServer.test(CORSRequestHandler, BaseHTTPServer.HTTPServer)
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 __== '__main__':
test(CORSRequestHandler, HTTPServer)
http-serverのような代替手段を試してください
SimpleHTTPServerは実際に運用環境に展開する種類のサーバーではないので、ここでhttp://localhost:3000
でファイルを公開するジョブを実行する限り、使用するツールについてそれほど気にしないと仮定しています単純なコマンドラインのCORSヘッダー
# install (it requires nodejs/npm)
npm install http-server -g
#run
http-server -p 3000 --cors
HTTPSが必要ですか?
ローカルでhttpsが必要な場合は、 caddy または certbot を試すこともできます
便利だと思うかもしれないいくつかの関連ツール
ngrok :ngrok http 3000
を実行すると、誰でもhttps://$random.ngrok.com
サーバーにアクセスできるURL http://localhost:3000
を作成します。コンピューターでローカルに実行されているもの(ローカルバックエンド/ APIを含む)を世界に公開できます。
localtunnel :ngrokとほぼ同じ
now :now
を実行すると、静的アセットがオンラインでアップロードされ、https://$random.now.sh
にデプロイされます。別の方法で決定しない限り、それらは永遠にオンラインのままです。差分のおかげで、展開は高速です(最初のものを除く)。現在、本番環境のフロントエンド/ SPAコードの展開に適しています。DockerおよびNodeJSアプリも展開できます。それは本当に無料ではありませんが、彼らは無料のプランを持っています。
私は同じ問題を抱えていて、この解決策に来ました:
class Handler(SimpleHTTPRequestHandler):
def send_response(self, *args, **kwargs):
SimpleHTTPRequestHandler.send_response(self, *args, **kwargs)
self.send_header('Access-Control-Allow-Origin', '*')
send_response
メソッドのみを変更するSimpleHTTPRequestHandlerを継承する新しいクラスを作成しました。