2011-11-29 15 views
7

Przygotowałem mały skrypt, który powinien nakarmić klienta za pomocą html.Wysyłanie nagłówków http pytonem

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

Ale jest pokazany jako zwykły tekst w przeglądarce. Czy możesz powiedzieć, co muszę zrobić? Po prostu nie mogę znaleźć w Google czegoś, co mi pomoże.

Dzięki.

Odpowiedz

13

Nagłówek odpowiedzi powinien zawierać kod odpowiedzi wskazujący powodzenie. Przed Content-Type linii, dodać:

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

Ponadto, aby zrobić test bardziej widoczna, umieścić niektóre treści na stronie:

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

po odpowiedzi zostanie wysłana, zamknij połączenie z:

client.close() 

i

sock.close() 

Jak zauważono na innych plakatach, zakończ każdą linię numerem \r\n zamiast \n.

Czy te dodatki, udało mi się uruchomić pomyślnie test. W przeglądarce wprowadziłem localhost:8080.

Oto cały kod:

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

... i nie zapomnij, aby zastąpić \ n \ n na \ r \ n \ r \ n, ponieważ HTTP wymaga wysłania CRLF po nagłówkach. – werewindle

+0

i lepiej używać "\ r \ n \ r \ n" zamiast "\ n \ n" – dmitry

+0

Wow, to wszystko. Dziękuję Ci ! Czy są jakieś powiązane dokumenty dotyczące wymiany między serwerem a klientem za pomocą protokołu http? –

0

webob robi brudne szczegóły http dla Ciebie także

from webob import Response 
.... 

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

Zauważ, że webob używa '\ n' do oddzielenia linii zamiast poprawnego' \ r \ n'. To jest [# 146] (https://github.com/Pylons/webob/pull/146). Przeglądarki nie wydają się tym jednak przejmować, więc twoje rozwiązanie będzie działać dobrze w większości przypadków. –

Powiązane problemy