0

我想了解如何在 web2py web 框架中实现全局变量。我假设读者知道 web2py 应用程序的结构。

我不明白如何在没有任何导入语句的情况下db在每个控制器文件中使用变量。.py我发现它db是在其中创建models/db.py并绑定到current.db. 如何db在没有任何导入的情况下在全球范围内可用。谢谢!

4

2 回答 2

2

这就在文档中:

模型、控制器和视图在已经为我们导入以下对象的环境中执行:

(那是参考文档;教程实际上说了同样的话,但没有导入所有内容的完整列表。)

如果您想知道它是如何工作的,基本概念很简单:web2py不只是将您的 Web 应用程序作为独立脚本运行;它以它想要的方式加载和执行你的代码。如果您想要完整的详细信息,请参阅源代码。(从compileapp.py 来看,它们似乎正在公开公开用于加载应用程序及其组件的接口的一部分,但还没有实现。)

如果您想知道可以做类似事情的不同方法,有两种基本方法。

hacky 的解决方案是完全跳过import,并用于exec在自定义globals. (稍微好一点,您可以compile使用文件(如果需要,甚至可以使用标准的 .pyc 缓存机制),然后exec是生成的代码对象。)如果您想直接在顶级命名空间中运行模块,或者如果您需要比模块更多的隔离,并计划自己构建它。但通常这不是你想要的。

另一种解决方案是截取部分import进程。对于简单的情况,只需__import__使用自定义调用即可globals

但是这样做的框架通常需要定制更多。Python 3.3+ 使这相对容易;如果您想与各种 Python 版本兼容,您最终会自己重写大部分import过程,我猜这就是这样web2py做的。

于 2013-09-06T22:39:29.197 回答
1

在 web2py 中,模型文件在已经填充了许多框架 API 对象的环境中执行。模型文件运行后,控制器将在同一环境中执行,因此在模型中创建的任何对象都将在控制器(和视图)中可用。

有关更多详细信息,请查看本书中的工作流程部分和调度部分的末尾。

请注意,db模型文件中定义的项目不会被 web2py添加到current线程本地对象中,尽管您可以自己在应用程序代码中显式添加它们。

于 2013-09-07T01:19:58.857 回答