Mik*_*ika 4 python simplehttpserver
我从http://www.linuxjournal.com/content/tech-tip-really-simple-http-server-python找到了一个 python http web 服务器
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()
Run Code Online (Sandbox Code Playgroud)
如果目录中有一个名为index.html的文件,则该文件将作为初始文件。如果没有index.html,那么将列出该目录中的文件。
如何修改脚本以便将自定义 html 发送到浏览器?
正如名称和文档所暗示的那样,SimpleHTTPServer非常简单,旨在用作在标准库中的框架之上构建您自己的服务器的示例代码。
因此,如果您想用它做任何事情,您可能想复制和修改源代码,或者只是将其用作灵感。
如果您想做任何严肃的事情,您可能需要使用一个用于编写真正的 HTTP 服务器的框架,例如tornado或,或者只使用一个普通的 HTTP 服务器并通过WSGItwisted等将动态页面委托给 Python 。
但如果你真的想这样做,你可以。没有什么可以阻止您子类化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()
Run Code Online (Sandbox Code Playgroud)
显然你可以在那里检查你想要的任何东西,而不是endswith('/foo'). 例如,正如您从源代码中看到的,默认实现会检查os.path.isdir,如果为真endswith('/'),则会检查它是否以及目录中是否有任何名为index.html或 的index.htm内容,然后再决定要做什么。