Bottle 框架源码学习 一
#-*-coding=utf-8-*-frombottleimportroute,run,template,Bottleapp=Bottle()@route("/hello/<name>")defindex(name):returntemplate("<b>Hello,`name`</b>",name=name)run(app,host="localhost",port=8080,reloader=True)
以上是官方一个简单示例,
route 装饰器的作用是将浏览器请求的路径绑定到指定的函数(index)中,浏览器访问http://localhost:8080/hello/youname时,实际上就是调用了index函数。
下面看看route源码
defmake_default_app_wrapper(name):'''Returnacallablethatrelayscallstothecurrentdefaultapp.'''@functools.wraps(getattr(Bottle,name))defwrapper(*a,**ka):returngetattr(app(),name)(*a,**ka)returnwrapperroute=make_default_app_wrapper('route')
route是make_default_app_wrapper的别名,作者这样写的目的是为了简化用户输入,而make_default_app_wrapper是是一个装饰器,装饰器的用法可以参考一下这些文章:
http://blog.scjia.cc/article/search/?wd=%E8%A3%85%E9%A5%B0%E5%99%A8
分析make_default_app_wrapper装饰器函数
1.
@functools.wraps(getattr(Bottle,name))
functools一python的标准库之一,wraps的作用是让被装饰的函数能保留原来的__name__、__doc
看functools.wraps的简单例子
importfunctoolsdefmake_decorator(f):@functools.wraps(f)defwrapper(*args,**kws):"""thisiswrapperdoc"""print'callingdecoratorfunction'returnf(*args,**kws)returnwrapper@make_decoratordefexample():"""thisismydoc"""print'thisisexample'example()>>callingdecoratorfunction>>thisisexampleexample.__name__>>'example'example.__doc__>>'thisismydoc'
如果去除@functools.wraps这段,__name__ 将输出wrapper, __doc__将输出this is wrapper doc
2. 再看
getattr(Bottle,name)
获取Bottle的route,因为Bottle是类,得到的是<unbound method Bottle.route>
returngetattr(app(),name)(*a,**ka)
app()里面怎么实现暂时不看,意思是获取app()对象的route方法,接着传递参数调用
相当于,app()->route("/hello/yourname")
route的内部实现先不看
声明:本站所有文章资源内容,如无特殊说明或标注,均为采集网络资源。如若本站内容侵犯了原著者的合法权益,可联系本站删除。