如何为Django设置交替目录结构?
我正在开始我的第一个大型 Django 项目,发现默认的文件夹结构不太适合我的需求。
我看到这个问题和答案,决定尝试实现类似的结构。大型 Django 应用布局
我需要做些什么才能让这样的结构工作?我该如何改变 Django 查找应用和模块的地方?
3 个回答
如果你在你的设置文件 .py 里加上:
import os
PROJECT_ROOT = os.path.abspath(os.path.dirname(__file__))
然后在你的 manage.py 文件里加上以下内容:
sys.path.insert(0, join(settings.PROJECT_ROOT, "apps"))
sys.path.insert(0, join(settings.PROJECT_ROOT, "lib"))
那么你就可以像在项目根目录下那样,把它们包含在你的已安装应用里:
INSTALLED_APPS = (
#local apps
'myapp',
#local libs
'piston_dev',
)
这样做可以让你更灵活地移动应用,而不需要重新声明导入等内容。
我有两种方法来处理这个问题,一种用于生产环境,另一种用于开发环境。
在开发环境中:
你需要在你的 settings.py
文件中添加应用的路径。以我的情况为例,我的主项目在 ~/hg/django/project/
,而我的应用则在 ~/hg/django/apps/
。所以我使用:
if DEVEL:
sys.path.insert(0, os.path.join(os.path.dirname(__file__), '..', 'apps'))
我在开发环境中也使用生产环境的方法。这种方法的好处是,如果我想回到最近的生产版本,只需要在 settings.py
文件中注释掉那行路径插入的代码就可以了。
在生产环境中:
我使用 distutils
来安装应用,这样我就可以根据每台服务器来控制部署,并且每台服务器上运行的多个项目都可以访问这些应用。你可以在这里了解有关 distutils
安装脚本 的更多信息。然后,安装时你只需要:
./setup.py install
Python可以自动处理很深的文件夹结构。这可能就是你找不到相关操作说明的原因。下面是一些关于如何让类和模型正常工作的说明。
如果你想在文件夹 yourproject/apps/firstapp
中创建一个模块,你只需要在INSTALLED_APPS中添加一行 'apps.firstapp',
。同时,你需要在每个目录下添加一个 __init__.py
文件,这样它们才能被识别为Python包。
当你导入类的时候,可以直接使用 from yourproject.apps.firstapp.filename import yourclass
。
你还需要确保所有的模板目录都在 TEMPLATE_DIRS
中列出。