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__官方文档
个人对于其中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__官方文档
相关文章推荐
- 廖老师python教程实战Day5-编写web框架理解
- Python3之Django Web框架URL匹配、反向解析及部分错误处理
- Python、C++中编写函数以及不使用临时变量交换两变量值的比较
- 简单介绍Python下自己编写web框架的一些要点
- 编写Python的web框架中的Model的教程
- 为Python的web框架编写MVC配置来使其运行的教程
- servlet 中 web.xml 的理解和URL地址映射个人理解
- python文件的中文处理以及个人思路
- 在Python的web框架中中编写日志列表的教程
- Python CGi URL 中文以及特殊转义字符的处理
- 在Python的web框架中编写创建日志的程序的教程
- Python Web框架Tornado的异步处理代码示例
- python下的web开发框架-Django,url配置
- Python:编写函数,能在当前目录以及子目录下查找文件名包含指定字符串的文件,并打印出完整路径
- 为Python的web框架编写MVC配置来使其运行的教程
- 多套方案来提高python web框架的并发处理能力 推荐
- 简单介绍Python下自己编写web框架的一些要点
- Python执行DOS命令以及处理url
- 为Python的web框架编写前端模版的教程
- webpy学习笔记——理解URL处理