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