📄 mpdbwebsrv.py
字号:
#!/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 + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -