Django 项目布局方法(值得推荐)
一、这种布局的优点
- 项目中的每个应用都相对独立,方便以后拿出来重用。
- 这样的布局会促使你在开发过程中考虑每个应用的重用性。
- 开发、测试、生产等不同的环境都有各自独立的配置文件,方便配置项的共享和定制。
- 不同的环境都有各自独立的piprequirements文件。
- 每个应用都有各自的templates和static目录,你可以通过项目级的templates和static目录中的文件对各应用中的相应内容进行覆盖。
- 对models、views、managers等的测试都各自保存在独立的文件中,易于阅读和理解。
二、Django默认产生的布局
假设项目名为foo,使用pythondjango-admin.pystartprojectfoo命令产生的默认布局会是:
foo/ manage.py foo/ __init__.py settings.py urls.py wsgi.py
三、推荐的项目布局
假设我们的项目名为myproject,其中有两个应用blog和users,推荐的项目布局可以为:
myproject/ manage.py myproject/ __init__.py urls.py wsgi.py settings/ __init__.py base.py dev.py prod.py blog/ __init__.py models.py managers.py views.py urls.py templates/ blog/ base.html list.html detail.html static/ css/ js/ … tests/ __init__.py test_models.py test_managers.py test_views.py users/ __init__.py models.py views.py urls.py templates/ users/ base.html list.html detail.html static/ css/ js/ … tests/ __init__.py test_models.py test_views.py static/ css/ js/ … templates/ base.html index.html requirements/ base.txt dev.txt test.txt prod.txt
1.每个应用的目录位置
最顶层的myproject目录包含有manage.py文件,因此是项目的根目录。myproject/myproject/是项目的内容目录,项目的根URL配置文件,WSGI配置文件都存放在这里面。
myproject/blog/和myproject/users/是项目的两个应用所在的目录,将blog、users这两个应用的目录与myproject/myproject/平行放置,而不放置在myproject/myproject/目录内的好处是:之后要import应用中的模块时,比如importblog应用中的models时,可以用importblog.models,而不需要用importmyproject.blog.models,这样也方便之后能将应用独立出来重用。
2.为每个环境设置各自的配置信息
针对项目的各个环境,如本地开发dev、内部测试stage、自动化流程环境jenkins及生产环境prod,分别创建独立的配置文件。
- 在myproject/myproject目录下新建一个settings目录并在里面创建一个空的__init__.py。
- 将myproject/myproject/settings.py文件搬到myproject/myproject/settings/目录下,并改名为base.py,这个文件里面的配置信息被所有其它环境的配置文件所共享。
- 在myproject/myproject/settings/目录下分别创建dev.py、stage.py、jenkins.py和prod.py4个文件,每个文件中包含如下的一行代码:
frombaseimport*
这样,这些环境配置文件就能读取默认的配置项了,之后就能在各自的配置文件中设置定制的配置值了。比如本地开发环境,可以在dev.py中添加DEBUG=True**,而生产环境**prod.py**,可以设置DEBUG=False`。
指定使用哪个配置文件:
可以通过操作系统的环境变量指定,比如:
exportDJANGO_SETTINGS_MODELS="myproject.settings.prod"
也可以通过命令行参数指定,比如:
./manage.pymigrate--settings=myproject.settings.prod
或者
gunicorn-w4-b127.0.0.1:8001--settings=myproject.settings.prod
3.修改INSTALLED_APPS
默认的INSTALLED_APPS会是:
INSTALLED_APPS=( ... )
可以将元组()改为列表[]:
INSTALLED_APPS=[ ... ]
进一步可以将INSTALLED_APPS中的第三方(内置)的应用与我们自己的应用分开,如:
PREREQ_APPS=[ ‘django.contrib.auth', ‘django.contrib.contenttypes', … ‘debug_toolbar', ‘imagekit', ‘haystack', ] PROJECT_APPS=[ ‘homepage', ‘users', ‘blog', ] INSTALLED_APPS=PREREQ_APPS+PROJECT_APPS
这样分开后,我们就可以只针对我们自己的应用进行test和codecoverage。
以上针对INSTALLED_APPS的修改也可以针对TEMPLATE_DIRS和MIDDLEMARE_CLASSES进行。
4.调整piprequirements
项目一般都有一个requirements.txt文件,可以指定项目的依赖包,根据这个文件,可以用以下命令对依赖包进行自动安装:
pipinstall-rrequirements.txt
在requirements.txt文件中可以用-rfilename来包含进另一个文件的内容,这个功能和C语言中的#include
因此,我们可以将通用的依赖信息保存在myproject/requirements/base.txt文件中,而针对不同的环境,比如测试环境,保存在另一个文件中,如myproject/requirements/test.txt,里面的内容可能会是:
-rbase.txt pytest==2.5.2 coverage==3.7.1
5.分割测试文件
在每个应用中分别创建一个包含测试内容的目录tests,将对应不同类别的测试分别保存在不同的文件中,如test_models.py、test_views.py等。这样分配,比起将全部测试代码放在单个文件中的好处是:代码更易阅读,同时还能减少在编辑器中上下翻滚的时间。
6.URL配置文件
先各个应用内的urls.py保存各自的URL配置,然后在项目的根URL配置文件中,通过include命令将子应用的URL配置信息包含进行:
urlpatterns=patterns(‘', url(r'^$',HomePageView.as_view(),name=‘home'), url(r'^blog/‘,include(‘blog.urls')), url(r'^user/‘,include(‘users.urls')), )
7.模板和静态文件
各个子应用都应该有各自的模板和静态文件目录,如blog的模板和静态文件目录位置应该为:myproject/blog/templates/blog/和myproject/blog/static/blog/。如果想对子应用中的模板和静态文件进行覆盖,可以通过在项目根模板和根静态文件目录中创建相同名字的文件进行。比如要覆盖blog中的detail.html模板,可以通过创建myproject/templates/blog/detail.html文件来对默认的模板文件进行覆盖。
8.重用子应用
如果想在另一个项目中重用blog应用,正确的方法是:
- 将blog应用提取出来,创建一个独立的代码库
- 在各个项目中,使用pipinstall的方式安装blog应用
- 在各个项目中,使用pip对依赖的blog进行更新
参考文献:http://www.revsys.com/blog/2014/nov/21/recommended-django-project-layout/
到此这篇关于Django项目布局方法(值得推荐)的文章就介绍到这了,更多相关Django项目布局方法(值得推荐)内容请搜索毛票票以前的文章或继续浏览下面的相关文章希望大家以后多多支持毛票票!