mpdbwebsrv.py
来自「python web programming 部分」· Python 代码 · 共 90 行
PY
90 行
#!/usr/bin/env python
#
"""A simple multi-port Python web server.
This version uses a revised database design in which a column has
been added to the data table to specify the port on which the page
should be served.
Start the server from the command line with the port numbers you
want to serve as arguments."""
import urllib
import mpdbpages
import asyncore, asynchat, socket, sys
class http_server(asyncore.dispatcher):
def __init__(self, ip, port, dbsource):
self.ip= ip
self.port = port
self.dbsource = dbsource
asyncore.dispatcher.__init__(self)
self.create_socket(socket.AF_INET, socket.SOCK_STREAM)
self.bind((ip, port))
self.listen(5)
def readable(self):
return self.accepting
def handle_accept(self):
try:
conn, addr = self.accept()
print "ACCEPT:", addr, self.port
except socket.error: # rare Linux error
print "Socket error on server accept()"
return
except TypeError: # rare FreeBSD3 error
print "EWOULDBLOCK exception on server accept()"
return
http_handler(conn, addr, self.dbsource)
class http_handler(asynchat.async_chat):
def __init__(self, conn, addr, dbsource):
asynchat.async_chat.__init__(self, conn=conn)
self.addr = addr
self.dbsource = dbsource
self.ibuffer = ""
self.obuffer = ""
self.set_terminator("\r\n\r\n")
def collect_incoming_data(self, data):
self.ibuffer += data.replace('\r', '')
def found_terminator(self):
request = self.ibuffer.split("\n")[0]
op, path, protocol = request.split(None, 2)
path = path[1:]
if not path:
path = "Home"
self.ibuffer = ""
self.obuffer = self.dbsource.page(self.addr, op, urllib.unquote(path), LOGGING=1)
def writable(self):
return len(self.obuffer) > 0
def handle_write(self):
sent = self.send(self.obuffer)
self.obuffer = self.obuffer[sent:]
if len(self.obuffer) == 0:
self.close()
if __name__ == "__main__":
if len(sys.argv) == 1:
ports = [8080]
else:
ports = [int(x) for x in sys.argv[1:]]
server = []
dbsource = []
for port in ports:
dbs = mpdbpages.dbsource("WebData", "mx", port)
dbsource.append(dbs)
server.append(http_server('', port, dbs))
try:
asyncore.loop(4.0) # Frequent checks for interrupt
except KeyboardInterrupt:
for dbs in dbsource:
dbs.close()
print "Finished"
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?