使用BaseHTTPRequestHandler写响应体
我正在玩Python 3.2.2,想写一个简单的网络服务器来远程访问一些数据。这些数据将由Python生成,所以我不想使用SimpleHTTPRequestHandler,因为它是一个文件服务器,而是想用我自己的处理程序。
我从网上复制了一些例子,但我遇到了问题,因为响应输出流不愿意写入内容。
这是我的代码:
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()
写响应内容的正确代码应该是什么样的呢?
非常感谢。
编辑:
错误信息是:
...
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
4 个回答
4
根据你代码里的注释,你可能想要使用 self.headers.getheaders('referer'),也就是:
if 'http://www.icamefromthissite.com/' in self.headers.getheaders('referer'):
do something
6
对于Python 3,在字符串前面加一个b
:
self.wfile.write(b"<foo>bar</foo>")
48
在Python3中,字符串的类型和Python 2.x是不一样的。如果你想把字符串转换成字节(bytes),可以使用下面的方式:
self.wfile.write(bytes("<html><head><title>Title goes here.</title></head>/html>","utf-8"))
或者你也可以用这个方法:
self.wfile.write("<html><head><title>Title goes here.</title></head></html>".encode("utf-8"))