from klein import run, route@route('/')
def home(request):return 'Hello, world!'run("localhost", 8080)
首先进入其ute
#route是Kelin类下的一个方法
route = _ute
_globalKleinApp = Klein()
def route(self, url, *args, **kwargs):"""Add a new handler for C{url} passing C{args} and C{kwargs} directly uting.Rule}. The handler function will be passed at leastone argument an L{twisted.web.server.Request} and any keyword argumentstaken from the C{url} pattern.::ute("/")def index(request):return "Hello"@param url: A werkzeug URL pattern given to uting.Rule}.@type url: str@param branch: A bool indiciated if a branch endpoint shouldbe added that allows all child path segments that don'tmatch some other route to be consumed. Default C{False}.@type branch: bool@returns: decorated handler function."""#用户的URL和基本URL一共几个'/'segment_count = self._segments_in_url(url) + self._subroute_segments#装饰器,返回deco@named("router for '" + url + "'")def deco(f):kwargs.setdefault('endpoint', f.__name__) #在kwargs里设置键值对endpoint为函数名字if kwargs.pop('branch', False): #如果kwargs里存在‘branch’branchKwargs = py() #深拷贝,一级目录深拷贝,二级目录浅拷贝(引用,指针)branchKwargs['endpoint'] = branchKwargs['endpoint'] + '_branch' #将拷贝对象的endpoint加上_branch@modified("branch route '{url}' executor".format(url=url), f)def branch_f(instance, request, *a, **kw):IKleinRequest(request).branch_segments = (kw.pop('__rest__', '').split('/'))return _call(instance, f, request, *a, **kw) #执行函数f(*args, **kwargs) args = (instance,) + argsbranch_f.segment_count = segment_countself._endpoints[branchKwargs['endpoint']] = branch_f#字典保存键值对(函数名字:branch_f)#路由分发里添加路由self._url_map.add(Rule(url.rstrip('/') + '/' + '<path:__rest__>',#在路由末尾添加'/',确保用户没有添加*args, **branchKwargs))@modified("route '{url}' executor".format(url=url), f)def _f(instance, request, *a, **kw):#_call就是f执行(*a,**kw)return _call(instance, f, request, *a, **kw)_f.segment_count = segment_countself._endpoints[kwargs['endpoint']] = _fself._url_map.add(Rule(url, *args, **kwargs))return freturn deco
是两层嵌套的装饰器函数
segment_count就是计算routr(url)中的url有几个'/'
#这个方法返回一个URL里的'/'数量@staticmethoddef _segments_in_url(url):segment_count = unt('/') #一个URL里有多少个'/'dswith('/'): #如果URL以'/'结尾,数量-1segment_count -= 1return segment_count
@name装饰器是改变函数的__name__和__qualname__为
"router for '" + url + "'"
#name——"router for '" + url + "'"
#original——function
#这个装饰器的作用是:改变函数__name__,和__qualname__,最后返回函数
def named(name):"""Change the name of a function to the given name."""def decorator(original):original.__name__ = str(name)original.__qualname__ = str(name)return originalreturn decorator
@modified装饰器是执行用户的function(branch_f)或者function(f),并返回结果
#modification "branch route '{url}' executor".format(url=url)
#original 也就是用户的function
def modified(modification, original, modifier=None):#wrapper是 def branch_f(instance, request, *a, **kw)def decorator(wrapper):result = (named(modification + ' for ' + original.__name__)(wraps(original)(wrapper)))#用户function执行_f,request=_f,request就是result = f(*args, **kwargs)result.__original__ = originalif modifier is not None:before = set(wrapper.__dict__.keys())result = modifier(result)after = set(wrapper.__dict__.keys())for key in after - before:setattr(original, key, wrapper.__dict__[key])return resultreturn decorator@modified("route '{url}' executor".format(url=url), f)
def _f(instance, request, *a, **kw):
#_call就是f执行(*a,**kw)return _call(instance, f, request, *a, **kw)
_f.segment_count = segment_countself._endpoints[kwargs['endpoint']] = _f
self._url_map.add(Rule(url, *args, **kwargs))
return f
之后实现路由添加
#路由分发里添加路由
self._url_map.add(Rule(url.rstrip('/') + '/' + '<path:__rest__>',#在路由末尾添加'/',确保用户没有添加*args, **branchKwargs))
虽然Klein是twisted实现的,但是route却不是基于twisted,正如同Flask也有route,这只是一种设计哲学,可以学来到处用。
真正用到Twisted的,应该在于run和template,稍后在看吧。
综上分析route实现两个功能
本文发布于:2024-01-29 11:32:33,感谢您对本站的认可!
本文链接:https://www.4u4v.net/it/170649915614972.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
留言与评论(共有 0 条评论) |