2011-11-29 27 views
7

He configurado una pequeña secuencia de comandos que debe alimentar a un cliente con html.Enviando encabezados http con python

import socket 

sock = socket.socket() 
sock.bind(('', 8080)) 
sock.listen(5) 
client, adress = sock.accept() 


print "Incoming:", adress 
print client.recv(1024) 
print 

client.send("Content-Type: text/html\n\n") 
client.send('<html><body></body></html>') 

print "Answering ..." 
print "Finished." 

import os 
os.system("pause") 

Pero se muestra como texto sin formato en el navegador. ¿Puedes decirme qué debo hacer? Simplemente no puedo encontrar algo en google que me ayude ...

Gracias.

Respuesta

13

El encabezado de respuesta debe incluir un código de respuesta que indique el éxito. Antes de la línea Content-Type, añadir:

client.send('HTTP/1.0 200 OK\r\n') 

Además, para hacer la prueba más visible, poner un poco de contenido en la página:

client.send('<html><body><h1>Hello World</body></html>') 

Después de la respuesta se envía, cierre la relación con:

client.close() 

y

sock.close() 

Como han observado los otros carteles, termine cada línea con \r\n en lugar de \n.

Serán esas adiciones, pude realizar una prueba exitosa. En el navegador, ingresé localhost:8080.

Aquí es todo el código:

import socket 

sock = socket.socket() 
sock.bind(('', 8080)) 
sock.listen(5) 
client, adress = sock.accept() 

print "Incoming:", adress 
print client.recv(1024) 
print 

client.send('HTTP/1.0 200 OK\r\n') 
client.send("Content-Type: text/html\r\n\r\n") 
client.send('<html><body><h1>Hello World</body></html>') 
client.close() 

print "Answering ..." 
print "Finished." 

sock.close() 
+1

... y no se olvide de reemplazar \ n \ n \ r \ n \ r \ n, ya que HTTP necesita CRLF para ser enviado después de encabezados. – werewindle

+0

y mejor usar '\ r \ n \ r \ n' en lugar de '\ n \ n' – dmitry

+0

Guau, eso es todo. Gracias ! ¿Hay algún documento relacionado sobre el intercambio entre el servidor y el cliente con el protocolo http? –

0

webob hace los detalles http sucios para usted también

from webob import Response 
.... 

client.send(str(Response("<html><body></body></html>"))) 
+0

Tenga en cuenta que webob usa '\ n' para separar las líneas en lugar de la correcta' \ r \ n'. Este es [# 146] (https://github.com/Pylons/webob/pull/146). Sin embargo, a los navegadores no parece importarles, por lo que su solución funcionará bien en la mayoría de los casos. –

Cuestiones relacionadas