python web框架——扩展模块的动态路由

Posted

技术标签:

【中文标题】python web框架——扩展模块的动态路由【英文标题】:python web framework -- dynamic routes to extension modules 【发布时间】:2013-06-02 12:14:37 【问题描述】:

我正在探索python的bottle web框架的使用。 Web 应用程序必须是可扩展的。也就是说,我将有一个类似“some/path/extensions/”的文件夹,未来的开发人员应该能够在其中放置此应用程序的扩展。例如:如果扩展名为“treelayout”(具有自己的一组 html 文件、js 文件等,这些文件将放在 .../.../extensions/treelayout/ 文件夹中。我的目标是一个看起来像这样的 url 路由器:

@GET("/some/path/extensions/:module/:func/:params")
def callmodule(module, func, params):
    #D = dictionary made out of variable number of params.
    #Then call module.func(D)  <== How can I do this given that module and func are strings?

例如,有人可以调用“h++p: //.../treelayout/create/maxnodes/100/fanout/10/depth/3”,这将调用新的扩展 treelayout.create( maxnodes: 100,扇出:10,深度:3)。

知道这是否可能与瓶子或任何其他 python 框架有关吗?

【问题讨论】:

【参考方案1】:

Python 语言可以将字符串变量映射到加载的模块和方法。

import sys 

@GET("/some/path/extensions/:module/:func/:params")
def callmodule(module, func, params):
    D = dict(params)
    # Pull module instance from systems stack
    moduleInstance = sys.modules[module]
    # Grab method from module
    functionInstance = getattr(moduleInstance,func)
    # Pass "D" variable to function instance
    functionInstance(D)

其他很好的例子可以在以下问题的答案中找到

Python: Convert string into function name; getattr or equal? listing all functions in a python module

【讨论】:

非常感谢 emcconville。我认为这绝对符合我的需求。

以上是关于python web框架——扩展模块的动态路由的主要内容,如果未能解决你的问题,请参考以下文章

Ngnix技术研究系列2-基于Redis实现动态路由

Tornado-基于正则的路由和动态分页

基于hi-nginx的web开发(python篇)——动态路由和请求方法

详解express搭建http服务,通过路由和中间件获取静态文件和动态数据的实现原理

django框架--路由系统

python上传模块,别人搜索不到