📄 dbwebsrv.py
字号:
#!/usr/bin/env python
#
# A simple database-driven web server
#
# $Revision: 14 $
# $Date: 8/03/01 12:58p $
#
import webpage
import asyncore, asynchat, socket, sys, cgi
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):
#
# Note that the standard input remains unread for POST
#
request = self.ibuffer.split("\n")[0]
print ">>>", request
op, path, protocol = request.split()
path = path[1:]
if not path:
path = "Home"
self.ibuffer = ""
if "?" not in path:
query = ""
else:
path, query = path.split("?", 1)
if path[-1] == "/": # just "path?query" will do
path = path[:-1]
path = path.split("/")
query = cgi.parse_qs(query, 1)
try:
pageclass = getattr(webpage, path[0])
except:
pageclass = webpage.ErrorPageIllegalPageType
self.obuffer = pageclass(self.dbsource, op, path[1:], query).Generate()
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])
sourcename = "prom2000"
port =8080
if len(sys.argv) >1:
try:
port = int(sys.argv[1])
except:
sys.exit("Illegal port number")
if len(sys.argv)>2:
stype = sys.argv[2]
if stype == "local":
sourcename = "prom2000"
elif stype == "remote":
sourcename = "prom20ss"
else:
sys.exit("Data source must be local or remote")
#
# logging hack
#
oldstdout = sys.stdout
sys.stdout = open("dbwebsrv.log", "a") or sys.exit("Cannot open dbwebsrv.log")
dbsource = webpage.dbsource(sourcename)
server = http_server('', port, dbsource)
try:
asyncore.loop(1.0) # Frequent checks for interrupt
except KeyboardInterrupt:
print "Finished" # to log
sys.stdout = oldstdout
print "Completed" # on console
dbsource.close()
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -