Pregunta Habilitar el control de acceso en el servidor HTTP simple


Tengo el siguiente script de shell para un servidor HTTP muy simple:

#!/bin/sh

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

Me preguntaba cómo puedo habilitar o agregar un encabezado CORS me gusta Access-Control-Allow-Origin: * a este servidor?


75
2018-02-22 16:00


origen


Respuestas:


Desafortunadamente, SimpleHTTPServer es así de simple que no permite ninguna personalización, especialmente no de los encabezados que envía. Sin embargo, puede crear un servidor HTTP simple usted mismo, usando la mayoría de SimpleHTTPServerRequestHandler, y simplemente agrega ese encabezado deseado.

Simplemente crea un archivo simple-cors-http-server.py (o lo que sea) y ponga lo siguiente dentro:

#!/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)

Entonces puedes hacer python simple-cors-http-server.py y lanzará su servidor modificado que configurará el encabezado CORS para cada respuesta.

Con el shebang en la parte superior, haga que el archivo sea ejecutable y colóquelo en su PATH, y puede ejecutarlo usando simple-cors-http-server.py también.


Para una solución que funcione con Python 3, puede cambiar las importaciones anteriores para importar desde el http.server módulo (todos los tipos están allí).

Alternativamente, puede usar esto que funciona tanto en Python 3 como en Python 2. El script primero intenta importar desde las ubicaciones de Python 3 y vuelve a 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)

129
2018-02-22 16:28



Pruebe una alternativa como http-server

Como SimpleHTTPServer no es realmente el tipo de servidor que despliega en la producción, supongo que no le importa tanto la herramienta que utiliza, siempre que expone sus archivos a la http://localhost:3000 con encabezados CORS en una línea de comando simple

# install (it requires nodejs/npm)
npm install http-server -g

#run
http-server -p 3000 --cors

Algunas herramientas relacionadas que pueden serle útiles

  • ngrok: cuando se ejecuta ngrok http 3000, crea una url https://$random.ngrok.com que permite a cualquier persona acceder a su http://localhost:3000 servidor. Puede exponer al mundo lo que se ejecuta localmente en su computadora (incluidos backends / apis locales)

  • localtunnel: casi lo mismo que ngrok

  • ahora: cuando se ejecuta nowcarga sus activos estáticos en línea y los implementa en https://$random.now.sh. Permanecen en línea para siempre a menos que decidas lo contrario. La implementación es rápida (excepto la primera) gracias a la diferencia. Ahora es adecuado para la implementación de código de frontend / SPA de producción. También puede implementar aplicaciones Docker y NodeJS. No es realmente gratis, pero tienen un plan gratuito.


59
2018-02-20 15:43



Tendrá que proporcionar sus propias instancias de do_GET () (y do_HEAD () si elige soportar operaciones HEAD). algo como esto:

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()

0
2018-02-22 16:10