Li *_*oyi 2 python filesystems django django-models
出于愚蠢的原因,我想彻底改变我的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
Run Code Online (Sandbox Code Playgroud)
我希望它是:
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
Run Code Online (Sandbox Code Playgroud)
因为我认为我的文件系统的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
Run Code Online (Sandbox Code Playgroud)
每当我尝试python manage.py syncdb时.我曾尝试PYTHONPATH环境变量设置为希望,这将导致任何和所有的Python脚本运行,以检查该文件夹并加载我的"外部"模块/家用/ Django的,但失败了.还有什么办法可以让manage.py在加载它的东西时检查这些外部文件夹吗?
通过这样的设置,您甚至可以将代码与django站点配置完全分开:
site/
yoursitename/
__init__.py
manage.py
settings.py
urls.py
src/
your/
namespaced/
apps/
app1/
models.py...
app2/...
Run Code Online (Sandbox Code Playgroud)
在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)
Run Code Online (Sandbox Code Playgroud)
最后,您作为鸡蛋或小点安装的所有"可重用"应用程序以相同的方式工作,它们只是生活在pythonpath中.