在项目文件夹外安装Django应用?
出于一些莫名其妙的原因,我想彻底改变我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
因为我觉得我的文件系统应该尽量平衡,减少高度,以确保搜索特定文件的时间是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 个回答
如果你用一个叫做setup.py的文件把你的应用打包起来,就可以把它们“安装”到你的虚拟环境中。这意味着这些应用在这个环境里可以使用,但在其他地方就不能用了。
我也这样做,即使是那些不打算重复使用的应用。部署的过程之一就是对我每个应用运行一次“pip install”,或者把这些应用推送到一个私有的pypi/cheeseshop服务器上。在开发的时候,我使用“pip install -e”,这意味着我可以直接编辑和运行应用,而不需要每次都重新设置。
有很多东西都依赖于设置文件,或者是和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
有了这样的设置,你甚至可以把你的代码和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)
最后,你安装的所有“可重用”的应用,无论是以egg格式还是pip格式,都是以同样的方式工作的,它们只是在pythonpath中存在。