def match(self, request: Request): for fn in self.__pre_interceptor__ : request = fn(request) if request is None: return None # 必须先匹配前缀 if not request.path.startswith(self.__prefix): return None # 前缀匹配,说明就必须这个 Router 实例独步一时,后续匹配不上,依然返回 None for methods, pattern, types, handler in self.__routetable: print(methods, pattern, types, handler) # not methods 表示一个方法都没有定义,就是支持全部方法 if not methods or request.method.upper() in methods: # 前提已经是以__prefix开头了,可以 replace,去掉 prefix 剩下的才是正则表达式需要匹配的路径 noprefix = request.path.replace(self.__prefix, '', 1) matcher = pattern.match(noprefix) if matcher: # 正则匹配 # 动态为 request 增加属性 request.groups = matcher.groups() # 所有的分组组成的元组,包括命名分组 # 解决类型问题 newdict = {} for k, v in matcher.groupdict().items(): newdict[k] = types[k](v) request.groupdict = AttrDict(newdict) # 命名分组组成的字典 response = handler(request) for fn in self.__post_interceptor__: response = fn(request,response) return response
def __call__(self, request:Request): for method, pattern, handler in self._Route.ROUTETABLE: if request.method in method or not method: matcher = pattern.match(request.path) if matcher: request.groups = matcher.groups() request.groupdict = matcher.groupdict() return handler(request) raise HTTPNotFound('<h1>ERROR PAGE</h1>')
def __call__(self, request: Request): for method, pattern, handler in self._Route.ROUTETABLE: # 判断方法是否相等必须使用continue;因为路由类中注册了多条路由,如果使用break或return;则把其他注册的路由也跳过,这样使不合理的 if request.method != method: continue matcher = pattern.match(request.path) if matcher: request.groups = matcher.groups() request.groupdict = matcher.groupdict() return handler(request) raise HTTPNotFound('<h1>ERROR PAGE</h1>')
def __call__(self, request:Request): for pattern, handler in self._Route.ROUTETABLE: matcher = pattern.match(request.path) if matcher: # 所有分组组成的元组,包含命名分组 # 1,动态在对象上添加 # 2,可以利用传参的方式 request.groups = matcher.groups() request.groupdict = matcher.groupdict() # 匹配成功,则交由对应的handler处理程序处理 return handler(request) # 所有都没有匹配则抛出找不到异常 raise HTTPNotFound('<h1>ERROR PAGE</h1>')
def __call__(self, request: Request): for methods, pattern, handler in self._Router.ROUTERTABLE: # 判断方法是否为空或请求方法在注册的方法中 if not methods or request.method in methods: # 正则匹配请求的路径 matcher = pattern.match(request.path) if matcher: # setattr对request对象设置属性 request.groups = matcher.groups() request.groupdict = matcher.groupdict() # setattr(request, 'groups', matcher.groups()) # setattr(request, 'groupdict', matcher.groupdict()) # handler处理方法 return handler(request) raise HTTPNotFound('<h1>ERROR PAGE</h1>')
def match(self, request: Request): # 如果请求开头没有匹配成功;则return一个None if not request.path.startswith(self.__prefix): return None # 7,头部匹配成功,则进入path处理 for methods, pattern, handler in self.__routetable: if not methods or request.method in methods: matcher = pattern.match( request.path.replace(self.__prefix, '', 1)) if matcher: request.groups = matcher.groups() request.groupdict = AttrDict(matcher.groupdict()) # request.groupdict = matcher.groupdict() # 最后调用handler处理函数,传入request,进行处理 return handler(request)
def match(self, request: Request): # 前缀没有匹配成功,则返回None 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: # 前缀匹配成功,通过replace去掉prefix剩下的才是正则表达式需要匹配的路径 matcher = pattern.match( request.path.replace(self.__prefix, '', 1)) if matcher: request.groups = matcher.groups() # 所有分组组成的元组,包含命名分组 request.groupdict = AttrDict( matcher.groupdict()) # 命名分组组成的字典被属性化 return handler(request)
def __call__(self, request: Request): path = request.path for method, pattern, handler in self._Router.ROUTERTABLE: if not method == request.method.upper(): continue matcher = pattern.match(path) print('method=', request.method.upper()) if matcher: print(matcher.groups()) print(matcher.group(0)) print(matcher.group(1)) print(22222, matcher.groupdict()) request.groups = matcher.groups() request.groupdict = matcher.groupdict() return handler(request)
def match(self, request: Request): # 必须先匹配前缀 if not request.path.startswith(self.__prefix): return None # 前缀匹配,说明就必须这个 Router 实例独步一时,后续匹配不上,依然返回 None for methods, pattern, handler in self.__routetable: # not methods 表示一个方法都没有定义,就是支持全部方法 if not methods or request.method.upper() in methods: # 前提已经是以__prefix开头了,可以 replace,去掉 prefix 剩下的才是正则表达式需要匹配的路径 matcher = pattern.match( request.path.replace(self.__prefix, '', 1)) if matcher: # 正则匹配 # 动态为 request 增加属性 request.groups = matcher.groups() # 所有的分组组成的元组,包括命名分组 request.groupdict = AttrDict( matcher.groupdict()) # 命名分组组成的字典 return handler(request)