Django 项目目录结构和 Python 路径配置

244 阅读2分钟

我在开发 Django 项目时,遇到了目录结构和 Python 路径相关的问题。我使用虚拟环境(例如 env)为每个 Django 项目部署一个干净的 Python 环境。我的基本目录结构如下:

huake_00198_.jpg

/env/
    /bin
    /db         <--- Django DB
    /downloads
    /lib
    /static     <--- Where css/imgs/js etc is served from
    /project/   <--- Django root
            /__init__.py
            /settings.py
            /manage.py
            /appsfolder/
                 /appname/
                       /__init__.py
                       /models/
                              /__init__.py
                              /somemodel.py
                       /urls/
                             /__init__.py
                             /someurl.py
                       /views/
                             /__init__.py
                             /someview.py

我希望每个项目都有一个用于应用程序的目录(例如 appsfolder),并且在每个应用程序中都有一个单独用于模型、视图和 URL 的目录。我遇到的问题在于 Python 路径和模块处理。在应用程序中,我不希望在导入模型时引用项目,即我应该使用:

import appname.models.modelname

而不是:

import projectname.models.modelname

这有助于提高代码的可重用性。

models 目录中,我有以下 __init__.py 代码:

from model1 import ModelName1
from model2 import ModelName2
from model3 import ModelName3

__all__ = ['ModelName1', 'ModelName2', 'ModelName3']

但是,当我尝试使用单独的 URL 文件(位于 /appname/urls/urlfile.py)并导入模型时,例如:

from appname.models.somemodel import ModelName

我会收到一个 "module not found" 错误。但是,如果我使用以下代码,则可以正常工作:

from appsfolder.appname.models.somemodel import ModelName

我猜想这是因为应用程序不在 Python 路径上,而是位于名为 appsfolder 的子文件夹中,但我不确定如何解决这个问题,同时保持代码的可重用性和相对性。

我知道有一种解决方案是将所有应用程序直接放在 Python 路径下的 site-packages 文件夹中,但我并不喜欢这个主意,因为我认为应用程序应该在项目中,尤其是当你使用虚拟环境时。

2. 解决方案

您可以将以下内容添加到您的 settings.py 文件中,以将 appsfolder 添加到您的 PYTHONPATH 中:

import os
import sys

PROJECT_ROOT = os.path.dirname(__file__)
sys.path.insert(0, os.path.join(PROJECT_ROOT, 'appsfolder'))

这将允许您在应用程序中使用以下导入:

from appname.models.somemodel import ModelName

而不会收到 "module not found" 错误。

代码示例

以下是一个完整的 settings.py 文件示例,其中包含上述代码:

import os
import sys

# Define the project root directory
PROJECT_ROOT = os.path.dirname(__file__)

# Add the apps folder to the Python path
sys.path.insert(0, os.path.join(PROJECT_ROOT, 'appsfolder'))

# Django settings
# ...

现在,您可以在应用程序中使用以下导入:

from appname.models.somemodel import ModelName

而不会遇到任何错误。