离开我用Django写的应用程序很长一段时间后,它并没有完成,但后来又在新的Mac上重新使用了。
我正在努力获取代码来引用其中的应用程序和文件,而没有显式路径。例如:
from myproject.app.file import object
而我记得不必myproject
每次都使用。
这改变了吗?我似乎记得要在manage.py
每次运行开发服务器时都将其添加到调用的路径中,但这一次没有用。
sys.path.append /path/to/myproject
那应该解决我遇到的问题吗?
我从一个简单的答案开始,它逐渐发展成为有关如何将项目的子目录添加到python路径的更多详细信息。也许有点题外话,但这对您可能很有用,所以无论如何我都按下了发布按钮。
我通常会在我的项目树中保留一堆我的小型可重复使用的应用程序,因为我不希望它们成长为独立的模块。我的项目树将如下所示:
manage.py
myproject/apps
myproject/libs
myproject/settings
...
仍然,默认情况下,Django仅将项目根目录添加到python路径。但是在我看来,让应用程序加载具有完整路径的模块是没有意义的:
from myproject.apps.author.models import Author
from myproject.libs.rest_filters import filters
两者都太冗长,并且由于我仅使用绝对导入,因此破坏了可重用性。更不用说如果有一天我会从某些库中构建出一个实际的python包,它将崩溃。
因此,我采取了以下步骤。我在路径中添加了相关文件夹:
# in manage.py
root = os.path.dirname(__file__)
sys.path.append(os.path.realpath(os.path.join(root, 'myproject', 'apps')))
sys.path.append(os.path.realpath(os.path.join(root, 'myproject', 'libs')))
但是,您必须确保无法从项目的根目录加载这些软件包,否则将遇到奇怪的问题,因为python会加载该模块的另一个副本。例如,isinstance(libs.foo.bar(), myproject.libs.foo.bar) == False
不过,这并不难:只需__init__.py
从添加到路径的文件夹中删除即可。这样可以确保它们不会从项目中衍生出来。
另外,除非您手动指定,否则Django的DiscoverRunner不会进入这些路径。这样做可能很好(如果每个模块都有自己的测试套件)。或者,您可以扩展流道,这样就知道了这一点:示例代码。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句