2013-04-04 87 views
3

我發現一個Python HTTP Web服務器從http://www.linuxjournal.com/content/tech-tip-really-simple-http-server-python如何從python http web服務器發送html字符串?

import sys 
import BaseHTTPServer 
from SimpleHTTPServer import SimpleHTTPRequestHandler 


HandlerClass = SimpleHTTPRequestHandler 
ServerClass = BaseHTTPServer.HTTPServer 
Protocol  = "HTTP/1.0" 

if sys.argv[1:]: 
    port = int(sys.argv[1]) 
else: 
    port = 8000 
server_address = ('127.0.0.1', port) 

HandlerClass.protocol_version = Protocol 
httpd = ServerClass(server_address, HandlerClass) 

sa = httpd.socket.getsockname() 
print "Serving HTTP on", sa[0], "port", sa[1], "..." 
httpd.serve_forever() 

如果目錄中有一個名爲index.html文件,該文件將擔任該初始文件。如果沒有index.html,則會列出目錄中的文件。

如何修改腳本,以便將自定義html發送到瀏覽器?

+1

你爲什麼要這麼做? Apache和Nginx的存在是有原因的。 SimpleHTTPServer是一個完整的玩具實現,它不適用於任何事情。 – 2013-04-04 19:08:45

+0

@TylerEaves我想在服務器上以root身份執行一個命令,並將其結果顯示給瀏覽器。 – Mika 2013-04-04 19:12:13

+0

頭像Flask這樣的最小框架。 – 2013-04-04 21:10:31

回答

4

正如名稱和文檔暗示的那樣,SimpleHTTPServer已經非常簡單,並且打算用作在標準庫的框架之上構建自己的服務器的示例代碼。

所以,如果你想做任何事情,你可能想要複製和修改the source,或者只是用它作爲靈感。

如果你想做的任何事情嚴重,你可能想使用寫實時HTTP服務器,比如tornadotwisted做了一個框架,或只使用一個股票HTTP服務器並委派通過動態頁面到Python,說,WSGI

但是,如果你真的想這樣做,你可以。沒有任何東西阻止你繼承SimpleHTTPServer.SimpleHTTPRequestHandler並覆蓋其方法。例如:

class MyHandler(SimpleHTTPRequestHandler): 
    def send_head(self): 
     if self.translate_path(self.path).endswith('/foo'): 
      body = gaping_security_hole(self.path) 
      self.send_response(200) 
      self.send_header("Content-type", "text/html; charset=utf-8") 
      self.send_header("Content-Length", str(len(body))) 
      self.end_headers() 
      return StringIO(body) 
     else: 
      return super(MyHandler, self).send_head() 

顯然你可以檢查你想要的而不是endswith('/foo')。例如,您可以從the source中看到,默認實現檢查os.path.isdir,如果它爲真,則檢查其是否爲endswith('/')以及該目錄是否有任何名爲index.htmlindex.htm的內容,然後再決定要執行的操作。

+0

我無法獲得此操作init'Handler = MyHandler() TypeError:__init __()只需要4個參數(給出1) ' – 2017-08-29 13:49:02

相關問題