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