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

📄 mpdbwebsrv.py

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