我想了解如何在 web2py web 框架中实现全局变量。我假设读者知道 web2py 应用程序的结构。
我不明白如何在没有任何导入语句的情况下db
在每个控制器文件中使用变量。.py
我发现它db
是在其中创建models/db.py
并绑定到current.db
. 如何db
在没有任何导入的情况下在全球范围内可用。谢谢!
这就在文档中:
模型、控制器和视图在已经为我们导入以下对象的环境中执行:
(那是参考文档;教程实际上说了同样的话,但没有导入所有内容的完整列表。)
如果您想知道它是如何工作的,基本概念很简单:web2py
不只是将您的 Web 应用程序作为独立脚本运行;它以它想要的方式加载和执行你的代码。如果您想要完整的详细信息,请参阅源代码。(从compileapp.py 来看,它们似乎正在公开公开用于加载应用程序及其组件的接口的一部分,但还没有实现。)
如果您想知道可以做类似事情的不同方法,有两种基本方法。
hacky 的解决方案是完全跳过import
,并用于exec
在自定义globals
. (稍微好一点,您可以compile
使用文件(如果需要,甚至可以使用标准的 .pyc 缓存机制),然后exec
是生成的代码对象。)如果您想直接在顶级命名空间中运行模块,或者如果您需要比模块更多的隔离,并计划自己构建它。但通常这不是你想要的。
另一种解决方案是截取部分import
进程。对于简单的情况,只需__import__
使用自定义调用即可globals
。
但是这样做的框架通常需要定制更多。Python 3.3+ 使这相对容易;如果您想与各种 Python 版本兼容,您最终会自己重写大部分import
过程,我猜这就是这样web2py
做的。