Bottle框架源码学习一-创新互联

# -*- coding=utf-8 -*-
from bottle import route, run, template,Bottle

app = Bottle()

@route("/hello/")
def index(name):
    return template("Hello, `name`", name=name)


run(app, host="localhost", port=8080, reloader=True)

以上是官方一个简单示例,

创新互联是一家专注于网站设计、成都网站制作与策划设计,桃城网站建设哪家好?创新互联做网站,专注于网站建设10余年,网设计领域的专业建站公司;建站业务涵盖:桃城等地区。桃城做网站价格咨询:13518219792

route 装饰器的作用是将浏览器请求的路径绑定到指定的函数(index)中,浏览器访问http://localhost:8080/hello/youname 时,实际上就是调用了index函数。

下面看看route源码

def make_default_app_wrapper(name):
    ''' Return a callable that relays calls to the current default app. '''
    @functools.wraps(getattr(Bottle, name))
    def wrapper(*a, **ka):
        return getattr(app(), name)(*a, **ka)
    return wrapper

route     = 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的简单例子

import functools

def make_decorator(f):
    @functools.wraps(f)
    def wrapper(*args, **kws):
        """this is wrapper doc"""
        print 'calling  decorator function'
        return f(*args, **kws)
    return wrapper
    
@make_decorator
def example():
    """ this is my doc """
    print 'this is example'

example()
>>calling  decorator function
>>this is example

example.__name__
>>'example'
example.__doc__
>>' this is my doc '

如果去除@functools.wraps这段,__name__  将输出wrapper, __doc__将输出this is wrapper doc

2. 再看

getattr(Bottle, name)

获取Bottle的route,因为Bottle是类,得到的是

return getattr(app(), name)(*a, **ka)

app()里面怎么实现暂时不看,意思是获取app()对象的route方法,接着传递参数调用

相当于,app()->route("/hello/yourname")

route的内部实现先不看

创新互联www.cdcxhl.cn,专业提供香港、美国云服务器,动态BGP最优骨干路由自动选择,持续稳定高效的网络助力业务部署。公司持有工信部办法的idc、isp许可证, 机房独有T级流量清洗系统配攻击溯源,准确进行流量调度,确保服务器高可用性。佳节活动现已开启,新人活动云服务器买多久送多久。


网站名称:Bottle框架源码学习一-创新互联
网址分享:http://hbruida.cn/article/dhpidp.html