从“mysite.app”中的INSTALLED_APPS中删除mysite前缀会阻止双重导入,为什么?

时间:2012-04-21 22:43:51

标签: python django

我遇到了post_save被调用两次的问题,没有明显的理由。现在似乎原因是双重导入,如下所述:Why is post_save being raised twice during the save of a Django model?接受答案建议删除有效的mysite mysite.foo部分,但为什么要进行双重导入?< / p>

1 个答案:

答案 0 :(得分:3)

The issue是由Python中的混合导入路径引起的。例如,可以在proj中找到具有sys.path的{​​{1}}结构。

proj/
   __init__.py
   app/
       __init__.py
       foo.py

# In proj directory, enter Python shell
>>> import sys

>>> before = set(sys.modules)
>>> import app.foo
>>> set(sys.modules) - before
set(['app', 'app.foo'])

>>> before = set(sys.modules)
>>> from proj.app import foo
>>> set(sys.modules) - before
set(['proj.app.foo', 'proj', 'proj.app'])

Python实际上将proj.app.fooapp.foo视为不同的模块。您可以发现app/__init__.pyapp/foo.py被导入两次,因此其中的任何内容实际上都会被执行两次。要解决此问题,我们应使用一致的导入路径:从proj级别或../proj级别。在您发布的链接中,'mysite.blog'很好 AS LONG AS 项目或Django文件中没有其他类似import blog的导入。

在Django 1.4中,问题主要由moving manage.py one directory up from project directory to its parent directory which is no longer a package, thus limit importing to proj level解决。

你也可以prevent duplicate signals by using dispatch_uid