框架路由


1. 基础路由

from webob import Response,Request
from webob.dec import wsgify
from wsgiref.simple_server import make_server
from webob.exc import HTTPNotFound
import re

class Router:
    ROUTERTABLE = []

    @classmethod
    def route(cls,pattern,*methods):
        def wapper(handel):
            cls.ROUTERTABLE.append((tuple(map(lambda x:x.upper(),(*methods,))),re.compile(pattern),handel))
            return handel
        return wapper

    @classmethod
    def get(cls,pattern):
        return cls.route(pattern,"GET","POST")

# @Router.register("/index","GET") #带参数装饰器
# @Router.get(r"^/$")
@Router.route(r"^/$")
def documenthandel(request:Request):
    res = Response()
    res.charset = "utf-8"
    res.body = b'<h1>magedu.com</h1>'
    return res

@Router.get(r"^/index$")
def indexhandel(request):
    res = Response()
    res.charset = "utf-8"
    res.body = b'<h1>magedu.com indexhandel</h1>'
    return res

@Router.get(r"^/python$")
def pythonhandel(request):
    res = Response()
    res.charset = "utf-8"
    res.body = b'<h1>magedu.com pythonhandel</h1>'
    return res

@Router.get(r"^/python/(?P<id>\d+)$")
def python123handel(request):
    res = Response()
    res.charset = "utf-8"
    res.body = b'<h1>magedu.com python123handel</h1>'
    return res

print(Router.ROUTERTABLE)

class App:
    _ROUTER=Router

    @wsgify
    def __call__(self, request:Request):
        for method,pattern,handel in self._ROUTER.ROUTERTABLE:
            if not method or request.method in method:
                path = pattern.match(request.path)
                print(request.path)
                print(path)
                if path:
                    print("gokkkkkkkkkkk")
                    # return handel #记得在处理返回函数时要讲需要处理的request传入handel,否则就有问题
                    return handel(request)

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

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()

2. 扩展路由

from webob import Response,Request
from webob.dec import wsgify
from wsgiref.simple_server import make_server
from webob.exc import HTTPNotFound
import re

class Router:
    """router for route"""
    def __init__(self,prefix:str=""):
        self._prefix = prefix.rstrip("/\\")
        self._routeable = []

    def route(self,pattern, *methods):
        def wapper(handel):
            self._routeable.append((tuple(map(lambda x: x.upper(), (*methods,))), re.compile(pattern), handel))
            return handel
        return wapper

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

    def match(self,request):
        path = request.path
        if not path.startswith(self._prefix):
            #如果前缀不匹配在立即返回,App中的response=None,如果匹配继续向下运行
            return None
        for method,pattern,handel in self._routeable:
            print(0,method,pattern,handel)
            if not method or request.method in method:
                matcher = pattern.match(request.path.replace(self._prefix,"",1))
                if matcher:
                    print("gokkkkkkkkkkk")
                    # return handel #记得在处理返回函数时要讲需要处理的request传入handel,否则就有问题
                    return handel(request)

class App:
    ROUTERS = []

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

    @wsgify
    def __call__(self, request: Request):
        for router in self.ROUTERS:
            response = router.match(request)
            if response:
                return response
        raise HTTPNotFound('<h1>你的访问页面被外星人劫持了</h1>')

idx = Router("/product")

@idx.route(r"^/$")
def documenthandel(request:Request):
    res = Response()
    res.charset = "utf-8"
    res.body = b'<h1>magedu.com</h1>'
    return res

@idx.get(r"^/index$")
def indexhandel(request):
    res = Response()
    res.charset = "utf-8"
    res.body = b'<h1>magedu.com indexhandel</h1>'
    return res

@idx.get(r"^/python$")
def pythonhandel(request):
    res = Response()
    res.charset = "utf-8"
    res.body = b'<h1>magedu.com pythonhandel</h1>'
    return res

py = Router("python")

@py.get(r"^/txt/(?P<id>\d+)$")
def python123handel(request):
    res = Response()
    res.charset = "utf-8"
    res.body = b'<h1>magedu.com python123handel</h1>'
    return res

print(idx._routeable)
print(py._routeable)
App.register(idx,py)
print(App.ROUTERS)


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()
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值