我有一个简单的Python代理功能:
import SocketServer, SimpleHTTPServer, urllib, re
PORT = 80
class Proxy(SimpleHTTPServer.SimpleHTTPRequestHandler):
def do_GET(self):
page = urllib.urlopen(self.path)
self.copyfile(page, self.wfile)
httpd = SocketServer.ForkingTCPServer(('', PORT), Proxy)
print "serving at port", PORT
httpd.serve_forever()
这可以按预期工作。但是我遇到了urlopen
返回类型的问题。
如果我这样修改类:
class Proxy(SimpleHTTPServer.SimpleHTTPRequestHandler):
def do_GET(self):
page = urllib.urlopen(self.path)
print page.read() # NEW LINE
self.copyfile(page, self.wfile)
我可以成功打印页面的html内容,但page
为空(虚空转发给客户端)。
我不明白为什么.read()
会清空file-type object
。
为了解决这个问题,我尝试重写内容:
content = page.read()
print page.read()
page.write(content)
但显然这个文件类型的对象没有write
方法。
如何读取/写入此文件类型对象并仍将有效页面返回给我的客户?
答案 0 :(得分:1)
可以使用某个整数调用文件对象上的read
方法,它将读取(并使指针前进)多个字节。没有参数的read
在EOF之前读取数据。如果你file.tell
,你会发现它现在指向文件中有很多字节的地方。如果要重置文件,可以执行file.seek(0)
。更好的设计可能是:
data = file.read()
print data
self.copyfile(data, self.wfile)
答案 1 :(得分:0)
我认为问题是,一旦来自urllib.urlopen的page.read()
完成,self.copyfile(page, self.wfile)
就不再侦听要写入self.wfile
的新输入。
您需要做的是直接将数据写入self.wfile
,而不是试图捎带/重定向另一个IO流。
所以,而不是:
content = page.read()
print page.read()
page.write(content)
你想:
content = page.read()
print page.read()
self.wfile.write(content)