python 编写web框架中的url处理函数以及个人理解

代码参考廖雪峰老师官网编写web框架

个人对于其中add_routes函数的理解:

def add_route(app, fn):
    method = getattr(fn, '__method__', None)
    path = getattr(fn, '__route__', None)
    if path is None or method is None:
        raise ValueError('@get or @post not defined in %s.' % str(fn))
    if not asyncio.iscoroutinefunction(fn) and not inspect.isgeneratorfunction(fn):
        fn = asyncio.coroutine(fn)
    logging.info('add route %s %s => %s(%s)' % (method, path, fn.__name__, ', '.join(inspect.signature(fn).parameters.keys())))
    app.router.add_route(method, path, RequestHandler(app, fn))

def add_routes(app, module_name):
    '''
    返回'.'最后出现的位置
    如果为-1,说明是 module_name中不带'.',例如(只是举个例子) handles 、 models
    如果不为-1,说明 module_name中带'.',例如(只是举个例子) aiohttp.web 、 urlib.parse()    n分别为 7 和 5 
    我们在app中调用的时候传入的module_name为handles,不含'.',if成立, 动态加载module
    '''
    n = module_name.rfind('.')
    #n=-1,说明module_name中不含'.',动态加载该module
    if n == (-1):
        mod = __import__(module_name, globals(), locals())
    #n!=-1 module_name中存在'.'
    else:
        '''
        比如 aaa.bbb 类型,我们需要从aaa中加载bbb
        n = 3
        name = module_name[n+1:] 为bbb
        module_name[:n] 为aaa    
        mod = getattr(__import__(module_name[:n], globals(), locals(), [name]), name),动态加载aaa.bbb
        上边三句其实相当于:
            aaa = __import__(module_name[:n], globals(), locals(), ['bbb'])
            mod = aaa.bbb
        还不明白的话看官方文档,讲的特别清楚:
            https://docs.python.org/3/library/functions.html?highlight=__import__#__import__
        '''
        name = module_name[n+1:]
        mod = getattr(__import__(module_name[:n], globals(), locals(), [name]), name)
    #for循环把所有的url处理函数给注册了
    for attr in dir(mod):
        if attr.startswith('_'):
            continue
        fn = getattr(mod, attr)
        if callable(fn):
            method = getattr(fn, '__method__', None)
            path = getattr(fn, '__route__', None)
            #注册url处理函数fn,如果不是url处理函数,那么其method或者route为none,自然也不会被注册
            if method and path:
                add_route(app, fn)
参考资料: __import__官方文档

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值