在项目文件夹之外安装Django Apps?

时间:2011-08-04 19:30:58

标签: python django django-models filesystems

出于愚蠢的原因,我想彻底改变我的Django项目文件系统的布局方式。特别是,我想将构成网站的实际应用程序移动到管理/设置文件中的单独文件夹中。例如,而不是:

django/
    site/
        __init__.py
        manage.py
        settings.py
        urls.py
        home/
            __init__.py
            views.py
            models.py
            template.html
        page/
            __init__.py
            views.py
            models.py
            template.html
        media/
            __init__.py
            styles.css
            picture1.jpg
            picture2.jpg

我希望它是:

django/
    site/
        __init__.py
        manage.py
        settings.py
        urls.py
    home/
        __init__.py
        views.py
        models.py
        template.html
    page/
        __init__.py
        views.py
        models.py
        template.html
    media/
        __init__.py
        styles.css
        picture1.jpg
        picture2.jpg

因为我认为我的文件系统的N-ary树尽可能平衡,最小化其高度以保证任何特定文件的O(lgn)搜索时间!!!

我设法设置了我的django.wsgi,这样当python运行时,我的所有“外部”文件夹都是系统路径的一部分,因此导入工作完美。同样,我做了一个os.chdir()来完成从文件加载系统的工作。 URL映射器也可以完美地工作,将传入的请求指向这些“外部”模块来处理。

但是,我没有设法让manage.py加载这些“外部”模块,大概是因为它没有通过django.wsgi运行,因此sys.path修改不适用于它们。因此,当我将这些外部文件夹放入INSTALLED_APPS(例如“home”而不是“site.home”)时,它找不到它们,给我:

Error: No module named home

每当我尝试python manage.py syncdb时。我已经尝试将PYTHONPATH环境变量设置为/ home / django,希望这会导致任何和每个python脚本运行以检查该文件夹并加载我的“外部”模块,但这也失败了。还有什么办法可以让manage.py在加载它的东西时检查这些外部文件夹吗?

4 个答案:

答案 0 :(得分:5)

通过这样的设置,您甚至可以将代码与django站点配置完全分开:

site/
    yoursitename/
        __init__.py
        manage.py
        settings.py
        urls.py
src/
    your/
        namespaced/
            apps/
                app1/
                    models.py...
                app2/...

在settings.py中只需将“src”目录加载到PYTHONPATH中:

SITE_PATH = os.path.abspath(os.path.dirname(__file__))
PROJECT_PATH = os.path.normpath(os.path.join(SITE_PATH, '..', '..'))
SRC_PATH = os.path.join(PROJECT_PATH, 'src')
if SRC_PATH not in sys.path:
    sys.path.insert(0, SRC_PATH)

最后,您作为鸡蛋或小点安装的所有“可重用”应用程序的工作方式相同,它们只是位于python路径中。

答案 1 :(得分:0)

我不能说我同意你的动机,但我相信问题仍在你的PYTHONPATH。在你的wsgi脚本中试试

import sys

sys.path += ['/home/django']

答案 2 :(得分:0)

关键设置文件和/或相对于manage.py编写的内容很多,至少我会将它们保存在根目录中。

django/
    __init__.py
    manage.py
    settings.py

    site/
        __init__.py
        urls.py
        other stuff.py
    home/
        __init__.py
        views.py
        models.py
        template.html
    page/
        __init__.py
        views.py
        models.py
        template.html
    media/
        __init__.py
        styles.css
        picture1.jpg
        picture2.jpg

答案 3 :(得分:0)

如果您使用setup.py文件打包应用程序,则可以将它们“安装”到virtualenv中。这将使它们可用于该环境,但不能用于其他任何地方。

我这样做,即使对于不可重复使用的应用也是如此。部署过程的一部分是为我拥有的每个应用程序运行'pip install'(或将应用程序推送到私人pypi / cheeseshop服务器)。开发使用'pip install -e',这意味着我可以编辑和运行,而无需每次都重新设置。