在Django项目中,我的目录结构如下所示:
project/
├╴module_name/
│ ├╴dbrouters.py
│ ...
...
在dbrouters.py
中,我定义了这样一个类:
class CustomDBRouter(object):
current_connection = 'default'
...
其思想是使用一个数据库路由器,将连接设置为在每个请求开始时使用,然后将该连接用于所有后续的数据库查询,类似于Django docs for automatic database routing中所描述的。你知道吗
一切都很好,除了当我想在脚本中导入CustomDBRouter
时,我必须使用绝对路径,否则会发生一些奇怪的事情。你知道吗
假设在应用程序的一个部分中,CustomDBRouter.current_connection
发生了更改:
import project.module_name.dbrouters.CustomDBRouter
...
CustomDBRouter.current_connection = 'alternate'
在应用程序的另一部分(假设在上述代码之后执行),我使用相对导入:
import .dbrouters.CustomDBRouter
...
print CustomDBRouter.current_connection # Outputs 'default', not 'alternate'!
我不明白为什么会这样。Python是否因为使用了不同的导入路径而为CustomDBRouter
创建了一个新的类对象?你知道吗
加分:有没有更好的方法来实现“全局”类属性?你知道吗
原来,问题是由另一个文件中的几行引起的:
引用
.dbrouters
的文件是使用“快捷方式”路径导入的(例如,import views
而不是import module_name.views
)。你知道吗这取决于脚本的执行方式。使用相对导入时,必须确保导入所在的脚本的名称具有
__name__
属性而不是__main__
。如果是这样,import .dbrouters.CustomDBRouter
就会变成import __main__.dbrouters.CustomDBRouter
。你知道吗我找到了这个here。你知道吗
相关问题 更多 >
编程相关推荐