2011-10-04 70 views
24

Tôi đang chơi một chút với Python 3.2.2 và muốn viết một máy chủ web đơn giản để truy cập một số dữ liệu từ xa. Dữ liệu này sẽ được tạo ra bởi Python vì vậy tôi không muốn sử dụng SimpleHTTPRequestHandler vì nó là một máy chủ tập tin, mà là một trình xử lý của riêng tôi.Viết nội dung phản hồi bằng BaseHTTPRequestHandler

Tôi đã sao chép một số ví dụ từ internet nhưng tôi bị kẹt vì dòng đầu ra phản hồi từ chối viết nội dung cơ thể.

Đây là mã của tôi:

import http.server 
import socketserver 

PORT = 8000 

class MyHandler(http.server.BaseHTTPRequestHandler): 
    def do_HEAD(self): 
     self.send_response(200) 
     self.send_header("Content-type", "text/html") 
     self.end_headers() 
    def do_GET(self): 
     self.send_response(200) 
     self.send_header("Content-type", "text/html") 
     self.end_headers() 
     print(self.wfile) 
     self.wfile.write("<html><head><title>Title goes here.</title></head>") 
     self.wfile.write("<body><p>This is a test.</p>") 
     # If someone went to "http://something.somewhere.net/foo/bar/", 
     # then s.path equals "/foo/bar/". 
     self.wfile.write("<p>You accessed path: %s</p>" % self.path) 
     self.wfile.write("</body></html>") 
     self.wfile.close() 

try: 
    server = http.server.HTTPServer(('localhost', PORT), MyHandler) 
    print('Started http server') 
    server.serve_forever() 
except KeyboardInterrupt: 
    print('^C received, shutting down server') 
    server.socket.close() 

gì phải là một mã chính xác cho văn bản cho cơ phản ứng?

Cảm ơn rất nhiều.

Edit:

Lỗi này là:

... 
    File "server.py", line 16, in do_GET 
    self.wfile.write("<html><head><title>Title goes here.</title></head>") 
    File "C:\Python32\lib\socket.py", line 297, in write 
    return self._sock.send(b) 
TypeError: 'str' does not support the buffer interface 
+0

Tôi thừa nhận tôi không có những điều cơ bản trong Python :) vì vậy tôi là một chút mất cố gắng tìm ra cách làm việc với các loại và các công cụ cho chuyển chúng ... – helios

+0

dòng này ở đâu trong mã của bạn? self.wfile.write (prueba) – spicavigo

+0

Rất tiếc, tôi xin lỗi. Đó là dấu vết từ một thử nghiệm khác (prueba = test). Tôi sẽ sửa chữa nó. – helios

Trả lời

26

Trong Python3 chuỗi là một loại khác nhau hơn bằng Python 2.x. Quăng xuống byte bằng cách sử dụng

bytes(s, "utf-8") 

hoặc

s.encode("utf-8") 
+0

Tuyệt vời. Bây giờ tôi nghĩ rằng nếu có một cách để bọc một outputstream trong một "printwriter" (vâng, tôi là một lập trình viên Java), hehehe. Chúng ta hãy tìm một cái gì đó (hoặc đơn giản là định nghĩa một hàm chuyển đổi đơn giản) – helios

+3

Tôi đã thử với phép chuyển đổi chuỗi .encode() cho Python 3 nhưng vẫn còn một lỗi. Bạn phải xóa dòng cuối cùng: self.wfile.close() vì do_GET sẽ tự đóng và xóa luồng. –

2

dựa trên #comments bạn đang có lẽ bạn đang tìm kiếm self.headers.getheaders ('referer'), ví dụ:

if 'http://www.icamefromthissite.com/' in self.headers.getheaders('referer'): 
    do something 
+1

Vâng, không thực sự. Tôi chỉ muốn kiểm soát đầu ra theo chương trình của phản hồi. Câu trả lời được chấp thuận là những gì tôi cần. Để mã hóa các chuỗi thành các byte để gửi các byte tới phản hồi. Dù sao cũng cảm ơn bạn! – helios

3

Đối với Python 3, hãy thêm tiền tố chuỗi bằng một số b:

self.wfile.write(b"<foo>bar</foo>") 
+0

Đây là giải pháp sạch nhất ở đây, tốt đẹp! Bạn có thể xác nhận rằng điều này mặc định để mã hóa utf-8? –

0

Chỉ cần sử dụng này trong python3.X

self.wfile.write(bytes("<body><p>This is a test.</p>", "utf-8") 
Các vấn đề liên quan