J'ai le script shell suivant pour un serveur HTTP très simple:
#!/bin/sh
echo "Serving at http://localhost:3000"
python -m SimpleHTTPServer 3000
Je me demandais comment activer ou ajouter un en-tête CORS like Access-Control-Allow-Origin: *
sur ce serveur?
Malheureusement, le simple serveur HTTP est vraiment aussi simple qu'il ne permet aucune personnalisation, en particulier pour les en-têtes qu'il envoie. Vous pouvez cependant créer vous-même un serveur HTTP simple, en utilisant la plupart de SimpleHTTPRequestHandler
, et ajouter simplement l'en-tête souhaité.
Pour cela, créez simplement un fichier simple-cors-http-server.py
(ou autre) et, en fonction de la version Python que vous utilisez, insérez l’un des codes suivants.
Alors vous pouvez faire python simple-cors-http-server.py
et il lancera votre serveur modifié qui définira l'en-tête CORS pour chaque réponse.
Avec le Shebang en haut, rendez le fichier exécutable et placez-le dans votre PATH. Vous pouvez simplement l'exécuter à l'aide de simple-cors-http-server.py
.
Python 3 utilise SimpleHTTPRequestHandler
et HTTPServer
à partir du module http.server
pour exécuter le serveur:
#!/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 utilise SimpleHTTPServer.SimpleHTTPRequestHandler
et le module BaseHTTPServer
pour exécuter le serveur.
#!/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)
Si vous avez besoin de compatibilité pour Python 3 et Python 2, vous pouvez utiliser ce script polyglotte qui fonctionne dans les deux versions. Il essaie d’abord d’importer à partir des emplacements Python 3, puis retourne à 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)
Essayez une alternative comme http-server
Comme SimpleHTTPServer n’est pas vraiment le type de serveur que vous déployez en production, je suppose ici que vous vous moquez de savoir quel outil vous utilisez tant que vous exposez vos fichiers à http://localhost:3000
avec les en-têtes CORS ligne de commande simple
# install (it requires nodejs/npm)
npm install http-server -g
#run
http-server -p 3000 --cors
Quelques outils connexes qui pourraient vous être utiles
ngrok : lors de l'exécution de ngrok http 3000
, il crée une URL https://$random.ngrok.com
qui permet à quiconque d'accéder à votre serveur http://localhost:3000
. Il peut exposer au monde ce qui fonctionne localement sur votre ordinateur (y compris les backends/apis locaux)
localtunnel : presque identique à ngrok
now : lors de l'exécution de now
, il télécharge vos actifs statiques en ligne et les déploie vers https://$random.now.sh
. Ils restent en ligne pour toujours, sauf décision contraire de votre part. Le déploiement est rapide (sauf le premier) grâce à diffing. Il convient désormais au déploiement de code SPA/frontend de production. Il peut également déployer des applications Docker et NodeJS. Ce n'est pas vraiment gratuit, mais ils ont un plan gratuit.
J'ai eu le même problème et est venu à cette solution:
class Handler(SimpleHTTPRequestHandler):
def send_response(self, *args, **kwargs):
SimpleHTTPRequestHandler.send_response(self, *args, **kwargs)
self.send_header('Access-Control-Allow-Origin', '*')
J'ai simplement créé une nouvelle classe héritant de SimpleHTTPRequestHandler qui ne modifie que la méthode send_response
.