📄 dbwebsrv.py
字号:
#!/usr/bin/env python
#
# A simple database-driven web server
#
import dbpages
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()
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()
path = path[1:]
if not path:
path = "Home"
self.ibuffer = ""
self.obuffer = dbsource.page(op, path)
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) < 2:
type = "mx"
else:
type = sys.argv[1].lower()
if type not in ('mx', 'gf', 'odbc'):
sys.exit("USAGE: %s mx | gf | odbc\n" % sys.argv[0])
dbsource = dbpages.dbsource("WebData", type)
server = http_server('', 8080, dbsource)
try:
asyncore.loop(4.0) # Frequent checks for interrupt
except KeyboardInterrupt:
dbsource.close()
print "Finished"
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -