gpt4 book ai didi

python - 从 "mysite.app"中的 INSTALLED_APPS 中删除 mysite 前缀可以防止双重导入,为什么?

转载 作者:太空宇宙 更新时间:2023-11-03 11:09:10 24 4
gpt4 key购买 nike

我遇到了 post_save 被无缘无故地调用两次的问题。现在看来,原因是这里描述的双重导入:Why is post_save being raised twice during the save of a Django model?接受答案建议删除 mysite.foomysite 部分有效,但为什么它会进行双重导入?

最佳答案

The issue是由 Python 中混合导入路径引起的。以在 sys.path 中可找到的 proj 结构为例。

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

关于python - 从 "mysite.app"中的 INSTALLED_APPS 中删除 mysite 前缀可以防止双重导入,为什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10263686/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com