您的位置:首页 > 编程语言 > Python开发

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

2018-01-31 15:57 1431 查看
代码参考廖雪峰老师官网编写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__官方文档
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: