web2py中的全局变量

2024-10-01 15:45:09 发布

您现在位置:Python中文网/ 问答频道 /正文

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

我不明白为什么变量db在没有任何import语句的每个控制器.py文件中都是可用的。 我发现它db是在models/db.py中创建的,并且与{}结合。 如何使db在没有任何导入的情况下全局可用。 谢谢您!在


Tags: 文件pyimport框架应用程序dbmodels情况
2条回答

就在the docs中:

Models, controllers, and views are executed in an environment where the following objects are already imported for us:

(这是参考文档;本教程实际上也是这么说的,但没有完整列出导入的所有内容。)

如果您想知道它是如何工作的,基本概念simple:web2py不仅仅是作为一个独立的脚本运行web应用程序;它以它想要的方式加载和执行代码。如果你想要完整的细节,请参阅资料来源。(从compileapp.py看来,它们已经部分公开了用于在环境中加载应用程序及其组件的接口,但还没有达到目的。)

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

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

另一种解决方案是拦截import进程的一部分。对于简单的情况,只需使用自定义的globals调用^{}。在

但是这样做的框架通常需要定制更多。python3.3+使得这一点相对容易;如果您希望与各种Python版本兼容,那么您最终将自己重写import进程的大块内容,我猜这就是web2py的作用。在

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

有关更多详细信息,请查看本书中的Workflow部分和Dispatching部分的末尾。在

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

相关问题 更多 >

    热门问题