def __call__(self, request: Request) -> Response: for methods, pattern, handler in self.ROUTETABLE: if not methods or request.method in methods: if request.method.upper() == "GET": matcher = pattern.match(request.path) if matcher: # 动态增加属性 request.args = matcher.group() # 所有分组组成的元组,包括命名的 request.kwargs = matcher.groupdict() # 命名分组组成的字典 return handler(request) raise exc.HTTPNotFound("<h1>您访问的页面被外星人劫持了</h1>")
def __call__(self, request: Request): for methods, pattern, handler in self.Routable: # not methods表示一个方法都没有定义,即支持所有方法 if not methods or request.method.upper() in methods: matcher = pattern.match(request.path) if matcher: # 动态增加属性,为request增加了args、kwargs属性,在handler中使用的时候 # 就可以直接从属性中,将args、kwargs拿出来就可以直接使用了 request.args = matcher.group() # 所有分组组成的元组,包括命令的 request.kwargs = matcher.groupdict() # 命名分组组成的字典 return handler(request) raise exc.HTTPNotFound('<h1>您访问的页面被外星人劫持了</h1>'.encode())
def match(self, request: Request): if not request.path.startswith(self.prefix): # 减少嵌套层次 return for methods, pattern, handler in self.__routetable: if not methods or request.method.upper() in methods: matcher = pattern.match(request.path.replace( self.prefix, "")) # pattern 是prefix后面的所以匹配的字符串也需要去掉prefix if matcher: request.args = matcher.group() request.kwargs = Dict2Obj( matcher.groupdict()) # request.kwargs.k -> k可以直接访问 return handler(request)
def __call__(self,request:Request) -> Response: print(request.path) #return self.ROUTETABLE.get(request.path,self.notfound)(request) for methods, pattern, handler in self.ROUTETABLE: #methods为None时表示支持任意http请求方法 if not methods or request.method.upper() in methods: matcher = pattern.match(request.path) if matcher: #动态属性增加 request.args = matcher.group() #所有分组组成的元组,包括命名的 request.kwargs = matcher.groupdict() #命名分组组成的字典 return handler(request) raise exc.HTTPNotFound("您访问的网页被外星人劫持了")
def match(self,request:Request) -> Response: print(request.path) #return self.ROUTETABLE.get(request.path,self.notfound)(request) for methods, pattern, handler in self.__routetable: if not request.path.startswith(self.prefix): return None #methods为None时表示支持任意http请求方法 if not methods or request.method.upper() in methods: matcher = pattern.match(request.path.replace(self.prefix,'',1)) if matcher: #动态属性增加 request.args = matcher.group() #所有分组组成的元组,包括命名的 request.kwargs = DictObj(matcher.groupdict()) #命名分组组成的字典 return handler(request)
def match(self, request: Request): # 前缀处理,prefix是一级的 if not request.path.startswith(self.__prefix): return for methods, pattern, handler in self.__routable: if not methods or request.method.upper() in methods: # not methods表示一个方法都没有定义,就让其支持全部方法 matcher = pattern.match(request.path.replace(self.__prefix, '', 1)) if matcher: # 动态增加属性,为request增加了args、kwargs属性,在handler中使用的时候, # 就可以直接从属性中,将args、kwargs拿出来就可以直接使用了 request.args = matcher.group() request.kwargs = matcher.groupdict() return handler(request)
def __call__(self, request: Request) -> Response: for methods, pattern, handler in self.ROUTE: if methods: if isinstance( methods, (list, tuple, set)) and request.method not in methods: continue if isinstance(methods, str) and methods != request.method: continue m = pattern.match(request.path) if m: request.args = m.groups() request.kwargs = _Var(m.groupdict()) return handler(request) raise exc.HTTPNotFound('Not Fount')
def wsgiapp(env, start_response): request = Request(env) request.args = getattr(request, request.method,{}) request.user_id = 0 # Try to hit actual responders for n, c in handlers.iteritems(): if request.path_info == '/%s' % n: try: resp = c().render(request) except Exception, e: traceback.print_exc() e_msg = "Oh snaps, I messed up. SOWEE." start_response("500 SERVER ERROR", [('content-type','text/html'), ('content-length',len(e_msg))]) return [e_msg] start_response(resp.status, resp.headerlist) return [resp.body]
def match(self,request:Request) -> Response: #判断是否属于这个Router实例管辖的路由prefix前缀 if not request.path.startswith(self.__prefix): return None #TODO router做请求处理前的拦截 for fn in self.pre_interceptor: request = fn(self.ctx,request) for methods,pattern,handler in self.__routertable: if not methods or request.method.upper() in methods: matcher = pattern.match(request.path.replace(self.__prefix,"",1)) if matcher: request.args = matcher.group() #在这里包装一下我们获得的属性,但是不允许在修改 request.kwargs = DictObj(matcher.groupdict()) response = handler(self.ctx,request) #TODO router局部做请求响应前的拦截 for fn in self.post_interceptor: response = fn(self.ctx,request,response) return response