类flask框架路由分组功能

路由分组

from wsgiref.simple_server import make_server
import cgi
from urllib import parse
import webob
from webob.dec import wsgify
from webob.exc import HTTPNotFound
import re

class Route:
    ROUTETABLE = []
    def __init__(self, prefix:str=''):
        self.__prefix = prefix.rstrip('/\')
        self.__routetable = []

    def route(self, pattern, *methods):
        def wraper(handler):
            self.__routetable.append((tuple(map(lambda x:x.upper(), methods)), re.compile(pattern), handler))
            return handler
        return wraper


    def get(self, pattern):
        return self.route(pattern, 'GET')

    def post(self, pattern):
        return self.route(pattern, 'POST')

    def head(self, pattern):
        return self.route(pattern, 'HEAD')

    def match(self, request):
        if not request.path.startswith(self.__prefix):
            return None
        for methods, pattern, handler in self.__routetable:
            if not methods or request.method.upper() in methods:
                if pattern.match(request.path.replace(self.__prefix,'',1)):
                    return handler(request)

class App:
    __ROUTES = []

    @classmethod
    def register(cls, *routers):
        for router in routers:
            cls.__ROUTES.append(router)

    @wsgify
    def __call__(self, request):
        for router in self.__ROUTES:
            response = router.match(request)
            if response:
                return response

        raise HTTPNotFound('<h1>你访问的页面被外星人劫持了</h1>')


ind = Route()
python = Route('/python')
App.register(ind, python)

@ind.route('^/$')
def indexhandler(request):
    return 'index page'

@python.get('^/python$')
def pythonhandler(request):
    return 'python page'


if __name__ == '__main__':
    ip = '127.0.0.1'
    port = 9999
    server = make_server(ip, port, App())
    try:
        server.serve_forever()
    except KeyboardInterrupt:
        server.shutdown()
        server.server_close()
原文地址:https://www.cnblogs.com/soymilk2019/p/15100333.html