回答:
残念ながら、単純なHTTPサーバーは非常に単純なので、特にヘッダーを送信する場合はカスタマイズできません。ただし、ほとんどのを使用して、単純なHTTPサーバーを自分で作成し、SimpleHTTPRequestHandler
必要なヘッダーを追加するだけです。
そのためには、単にファイルsimple-cors-http-server.py
(またはその他)を作成し、使用しているPythonのバージョンに応じて、次のコードのいずれかを内部に配置します。
その後python simple-cors-http-server.py
、それを行うことができ、すべての応答にCORSヘッダーを設定する変更されたサーバーが起動します。
シェバング上部に、ファイルを実行可能にしますし、あなたの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 __name__ == '__main__':
test(CORSRequestHandler, HTTPServer, port=int(sys.argv[1]) if len(sys.argv) > 1 else 8000)
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 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)
HTTP/1.0 501 Unsupported method ('OPTIONS') Server: SimpleHTTP/0.6 Python/2.7.6 Date: Wed, 21 Jan 2015 23:16:10 GMT Content-Type: text/html Connection: close Access-Control-Allow-Origin: *
OPTIONS
ます。単純なリクエストについては、Access-Control-Allow-Origin
ヘッダーのみを送信するソリューションでも問題なく機能します。
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が必要な場合は、キャディまたはcertbotを試すこともできます
役立つと思われるいくつかの関連ツール
ngrok:実行すると、サーバーへのアクセスを許可ngrok http 3000
するURL https://$random.ngrok.com
が作成されhttp://localhost:3000
ます。コンピューターでローカルに実行されているもの(ローカルバックエンド/ APIを含む)を公開することができます。
localtunnel:ngrokとほぼ同じ
now:実行するとnow
、静的アセットがオンラインでアップロードされ、デプロイされhttps://$random.now.sh
ます。他に決定しない限り、それらは永久にオンラインのままです。差分のおかげで、展開は高速です(最初のものを除く)。本番フロントエンド/ SPAコードのデプロイに適しています。DockerアプリやNodeJSアプリもデプロイできます。本当に無料ではありませんが、無料プランがあります。
npm
持っていることがわかっているだけのマシンにインストールする必要がある解決策python
を見つけました。
私は同じ問題を抱えており、この解決策になりました:
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を継承する新しいクラスを作成しただけです。
do_GET()(およびHEAD操作をサポートする場合はdo_HEAD())の独自のインスタンスを提供する必要があります。このようなもの:
class MyHTTPServer(SimpleHTTPServer):
allowed_hosts = (('127.0.0.1', 80),)
def do_GET(self):
if self.client_address not in allowed_hosts:
self.send_response(401, 'request not allowed')
else:
super(MyHTTPServer, self).do_Get()