在 Django 中导入 global/app lib 文件夹

xeo*_*eor 2 python django

我有一个像这样的 Django 结构(仅显示库):

project/lib/ # Global libraries that will be used cross apps
project/lib/global_stuff.py
project/apps/app1/lib/special_for_app1.py
project/apps/app2/lib/special_for_app2.py
Run Code Online (Sandbox Code Playgroud)

有些应用程序没有 lib 文件夹。

from apps.app1.lib import special_for_app1工作正常。但是,当我位于已包含本地 lib 文件夹的文件夹中时,如何从全局 lib 文件夹导入?

从应用程序之一的应用程序views.py 文件内部:


from lib import global_stuff
Run Code Online (Sandbox Code Playgroud)

给我ImportError: cannot import name global_stuff


从 .lib 导入 global_stuff

给我ImportError: cannot import name global_stuff


from ..lib import global_stuff
Run Code Online (Sandbox Code Playgroud)

给我ImportError: No module named lib


from ...lib import global_stuff
Run Code Online (Sandbox Code Playgroud)

给我ValueError: Attempted relative import beyond toplevel package


from project.lib import global_stuff
Run Code Online (Sandbox Code Playgroud)

有效,但我真的不想在导入中使用项目名称本身。


有什么方法可以解决这个问题,不在导入中使用项目名称,或者改变整个库的想法。

或者还有其他好的做法来存储代码的主要部分吗?

ran*_*lan 5

您不想将项目名称与导入关联起来是正确的,因此有一个常见的模式:

project/
  |__/source/
  |     |__/lib/
  |     |__/app/
  |__/deployment/  # code for your production deployment maybe
  |
  |__/docs/   
  |__/tests/
  |__README
  |__requirements.txt
Run Code Online (Sandbox Code Playgroud)

并将 /path/to/project 放入 virtualenv 的路径中(你使用 virtualenv 对吧?)。

然后你可以在你的代码中做

from source.lib.blah import foo
from source.app.baz import bar
Run Code Online (Sandbox Code Playgroud)

编辑:当然,如果您不将代码作为开源发布,这才是最佳选择。仅当您有一个内部项目且管理层不断更改项目名称时:D