2014-10-27 75 views
0

返回我有一個簡單的功能的Python代理:修改頁面內容由urllib2.urlopen

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方法。

如何讀/寫這個文件類型的對象,並仍然返回一個有效的頁面到我的客戶端?

回答

1

對文件對象的read方法可以用一些整數來調用,它會讀取(並提前指針)多個字節。什麼read沒有參數是直到EOF讀數據。如果你做了file.tell,你會發現它現在指向一個文件中有很多字節的地方。如果你想重置你的文件,你可以做file.seek(0)。更好的設計,雖然可能有這樣的:

data = file.read() 
print data 
self.copyfile(data, self.wfile) 
+0

+1謝謝!關於如何寫入文件的任何想法?例如,一個禁止網站,我只想返回「你看不到這個」。 – Juicy 2014-10-28 00:10:23

+0

事實上,事實證明你的方法不起作用。該對象中沒有查找方法,而您的其他解決方案也有同樣的問題。數據然後是空的。 – Juicy 2014-10-28 00:36:22

0

我相信問題是,一旦page.read()從了urllib.urlopen完成,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)