⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 dbwebsrv.py

📁 python web programming 部分
💻 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 + -