Niestety, prosty serwer HTTP jest naprawdę tak prosty, że nie pozwala na żadne dostosowanie, szczególnie nie w przypadku wysyłanych nagłówków. Możesz jednak samodzielnie utworzyć prosty serwer HTTP, używając większości SimpleHTTPRequestHandler
, i po prostu dodać żądany nagłówek.
W tym celu po prostu utwórz plik simple-cors-http-server.py
(lub cokolwiek) i, w zależności od używanej wersji Pythona, umieść w nim jeden z poniższych kodów.
Następnie możesz to zrobić python simple-cors-http-server.py
i uruchomi zmodyfikowany serwer, który ustawi nagłówek CORS dla każdej odpowiedzi.
Z shebang na górze, uczyń plik wykonywalnym i umieść go w swojej PATH, i możesz go po prostu uruchomić używając simple-cors-http-server.py
też.
Rozwiązanie Python 3
Python 3 używa SimpleHTTPRequestHandler
i HTTPServer
z http.server
modułu do uruchamiania serwera:
#!/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)
Rozwiązanie Python 2
Python 2 używa SimpleHTTPServer.SimpleHTTPRequestHandler
i BaseHTTPServer
modułu do uruchamiania serwera.
#!/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)
Rozwiązanie Python 2 i 3
Jeśli potrzebujesz kompatybilności zarówno z Pythonem 3, jak i Pythonem 2, możesz użyć tego skryptu poliglota, który działa w obu wersjach. Najpierw próbuje zaimportować z lokalizacji Python 3, a w przeciwnym razie wraca do Pythona 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
poprawnej implementacji metody. Jeśli chodzi o proste żądania, rozwiązanie polegające na wysyłaniu samegoAccess-Control-Allow-Origin
nagłówka powinno nadal działać dobrze.Wypróbuj alternatywę, taką jak serwer http
Ponieważ SimpleHTTPServer nie jest tak naprawdę rodzajem serwera, który wdrażasz w środowisku produkcyjnym, zakładam, że nie obchodzi Cię, jakiego narzędzia używasz, o ile wykonuje on zadanie ujawniania plików
http://localhost:3000
z nagłówkami CORS w prostym wiersz poleceńPotrzebujesz protokołu HTTPS?
Jeśli potrzebujesz https w lokalnym, możesz również wypróbować caddy lub certbot
Niektóre powiązane narzędzia, które mogą okazać się przydatne
ngrok : podczas uruchamiania
ngrok http 3000
tworzy adres URL,https://$random.ngrok.com
który umożliwia każdemu dostęp do Twojegohttp://localhost:3000
serwera. Może ujawnić światu to, co działa lokalnie na twoim komputerze (w tym lokalne backendy / API)localtunnel : prawie taki sam jak ngrok
teraz : po uruchomieniu
now
przesyła statyczne zasoby online i wdraża je dohttps://$random.now.sh
. Pozostają online na zawsze, chyba że zdecydujesz inaczej. Wdrożenie jest szybkie (z wyjątkiem pierwszego) dzięki różnicowaniu. Teraz nadaje się do wdrażania kodu frontend / SPA. Może również wdrażać aplikacje Docker i NodeJS. To nie jest naprawdę darmowe, ale mają darmowy plan.źródło
npm
na komputerze, o którym wiadomo, że mapython
, głosuję przeciw.Miałem ten sam problem i doszedłem do takiego rozwiązania:
Po prostu utworzyłem nową klasę dziedziczącą po SimpleHTTPRequestHandler, która tylko zmienia
send_response
metodę.źródło
Będziesz musiał podać własne instancje do_GET () (i do_HEAD (), jeśli zdecydujesz się na obsługę operacji HEAD). coś takiego:
źródło