2011-11-29 42 views
7

Tôi đã thiết lập một tập lệnh nhỏ để nạp một ứng dụng khách với html.Gửi tiêu đề http với 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") 

Nhưng nó được hiển thị dưới dạng văn bản thuần trong trình duyệt. Bạn có thể vui lòng cho biết tôi cần làm gì không? Tôi không thể tìm thấy thứ gì đó trong google giúp tôi ..

Cảm ơn.

Trả lời

13

Tiêu đề phản hồi phải bao gồm mã phản hồi cho biết thành công. Trước Content-Type dòng, thêm:

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

Ngoài ra, để thực hiện các bài kiểm tra rõ hơn, đặt một số nội dung trong trang:

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

Sau khi phản ứng được gửi đi, đóng liên quan đến:

client.close() 

sock.close() 

Như các áp phích khác đã lưu ý, hãy chấm dứt mỗi dòng với \r\n thay vì \n.

Những bổ sung đó, tôi đã có thể chạy thử nghiệm thành công. Trong trình duyệt, tôi đã nhập localhost:8080.

Dưới đây là tất cả các mã:

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

... và đừng quên để thay thế \ n \ n \ r \ n \ r \ n, vì HTTP cần CRLF để gửi sau tiêu đề. – werewindle

+0

và tốt hơn để sử dụng '\ r \ n \ r \ n' thay vì '\ n \ n' – dmitry

+0

Ồ, đúng vậy. Cảm ơn bạn ! Có bất kỳ tài liệu liên quan nào về trao đổi giữa máy chủ và máy khách với giao thức http không? –

0

webob hiện các chi tiết http bẩn cho bạn là tốt

from webob import Response 
.... 

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

Lưu ý rằng webob sử dụng '\ n' để tách các dòng thay vì' \ r \ n' chính xác. Đây là [# 146] (https://github.com/Pylons/webob/pull/146). Tuy nhiên, các trình duyệt dường như không quan tâm, vì vậy giải pháp của bạn sẽ hoạt động tốt trong hầu hết các trường hợp. –

Các vấn đề liên quan