servidor - ¿Puedo establecer un encabezado con SimpleHTTPServer de python?
simplehttprequesthandler example (4)
Esto es un poco end_headers()
porque cambia el comportamiento de end_headers()
, pero creo que es un poco mejor que copiar y pegar todo el archivo SimpleHTTPServer.py
.
Mi enfoque reemplaza a end_headers()
en una subclase y en ella llama a send_my_headers()
seguido de la llamada a end_headers()
la superclase end_headers()
.
Tampoco es 1 - 2 líneas, menos de 20; principalmente placa de caldera.
#!/usr/bin/env python
import SimpleHTTPServer
class MyHTTPRequestHandler(SimpleHTTPServer.SimpleHTTPRequestHandler):
def end_headers(self):
self.send_my_headers()
SimpleHTTPServer.SimpleHTTPRequestHandler.end_headers(self)
def send_my_headers(self):
self.send_header("Access-Control-Allow-Origin", "*")
if __name__ == ''__main__'':
SimpleHTTPServer.test(HandlerClass=MyHTTPRequestHandler)
Estoy usando SimpleHTTPServer
para probar algunas páginas web en las que estoy trabajando. Funciona muy bien, sin embargo necesito hacer algunas solicitudes de dominios cruzados. Eso requiere establecer un encabezado de Access-Control-Allow-Origin
con los dominios a los que la página tiene acceso.
¿Hay una manera fácil de establecer un encabezado con SimpleHTTPServer y servir el contenido original? El encabezado sería el mismo en cada solicitud.
Si bien esta es una respuesta anterior, es el primer resultado en Google ...
Básicamente, ¿qué sugirió @ iMon0 ... parece correcto? .. Ejemplo de doPOST
def do_POST(self):
self.send_response()
self.send_header(''Content-type'',''application/json'')
self.send_header(''Access-Control-Allow-Origin'',''*'')
self.end_headers()
sTest = {}
sTest[''dummyitem''] = "Just an example of JSON"
self.wfile.write(json.dumps(sTest))
Al hacer esto, el flujo se siente correcto.
1: Usted recibe una solicitud
2: Usted aplica los encabezados y el tipo de respuesta que desea
3: Vuelve a publicar los datos que desea, sea lo que quiera o como quiera.
El ejemplo anterior funciona bien para mí y puede ampliarse aún más, es solo un servidor de publicación JSON. Así que dejaré esto aquí en SOF en caso de que alguien lo necesite o yo mismo vuelva dentro de unos meses.
Esto produce un archivo JSON válido solo con el objeto sTest, igual que una página / archivo generado por PHP.
Yo diría que no hay una manera simple de hacerlo, donde simple significa "solo agrega 1-2 líneas que escribirán el encabezado adicional y mantendrán la funcionalidad existente" . Entonces, la mejor solución sería subclasificar la clase SimpleHTTPRequestHandler
y volver a implementar la funcionalidad, con la adición del nuevo encabezado.
El problema detrás de por qué no hay una manera simple de hacer esto se puede observar al observar la implementación de la clase SimpleHTTPRequestHandler
en la biblioteca de Python: http://hg.python.org/cpython/file/19c74cadea95/Lib/http/server.py#l654
Observe el método send_head()
, particularmente las líneas al final del método que envían los encabezados de respuesta. Observe la invocación del método end_headers()
. Este método escribe los encabezados en la salida, junto con una línea en blanco que señala el final de todos los encabezados y el inicio del cuerpo de la respuesta: http://docs.python.org/py3k/library/http.server.html#http.server.BaseHTTPRequestHandler.end_headers
Por lo tanto, no sería posible subclasificar el controlador SimpleHTTPRequestHandler
, invocar el método de do_GET()
, y luego simplemente agregar otro encabezado, porque el envío de los encabezados ya ha finalizado cuando la llamada a la do_GET()
devuelve el método. Y tiene que funcionar así porque el método do_GET()
tiene que enviar el cuerpo (el archivo que se solicita), y para enviar el cuerpo, debe finalizar el envío de los encabezados.
Entonces, una vez más, creo que está atascado con la subclasificación de la clase SimpleHTTPRequestHandler
, implementándolo exactamente como el código en la biblioteca (¿solo copiar y pegar?), Y agregar otro encabezado antes de la llamada al método end_headers()
en send_head()
:
...
self.send_header("Last-Modified", self.date_time_string(fs.st_mtime))
# this below is the new header
self.send_header(''Access-Control-Allow-Origin'', ''*'')
self.end_headers()
return f
...
# coding: utf-8
import SimpleHTTPServer
import SocketServer
PORT = 9999
def do_GET(self):
self.send_response(200)
self.send_header(''Access-Control-Allow-Origin'', ''http://example.com'')
self.end_headers()
Handler = SimpleHTTPServer.SimpleHTTPRequestHandler
Handler.do_GET = do_GET
httpd = SocketServer.TCPServer(("", PORT), Handler)
httpd.serve_forever()