Django 项目布局方法(值得推荐)


Posted in Python onMarch 22, 2020

一、这种布局的优点

  1. 项目中的每个应用都相对独立,方便以后拿出来重用。
  2. 这样的布局会促使你在开发过程中考虑每个应用的重用性。
  3. 开发、测试、生产等不同的环境都有各自独立的配置文件,方便配置项的共享和定制。
  4. 不同的环境都有各自独立的 pip requirements 文件。
  5. 每个应用都有各自的 templates 和 static 目录,你可以通过项目级的 templates 和 static 目录中的文件对各应用中的相应内容进行覆盖。
  6. 对 models、views、managers 等的测试都各自保存在独立的文件中,易于阅读和理解。

二、Django 默认产生的布局

假设项目名为 foo, 使用 python django-admin.py startproject foo 命令产生的默认布局会是:

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 应用中的模块时,比如 import blog 应用中的 models 时,可以用 import blog.models,而不需要用 import myproject.blog.models,这样也方便之后能将应用独立出来重用。

2. 为每个环境设置各自的配置信息

针对项目的各个环境,如本地开发 dev、 内部测试 stage、 自动化流程环境 jenkins 及生产环境 prod,分别创建独立的配置文件。

  1. 在 myproject/myproject 目录下新建一个 settings 目录并在里面创建一个空的 __init__.py。
  2. 将 myproject/myproject/settings.py 文件搬到 myproject/myproject/settings/ 目录下,并改名为 base.py,这个文件里面的配置信息被所有其它环境的配置文件所共享。
  3. 在 myproject/myproject/settings/ 目录下分别创建 dev.py、stage.py、jenkins.py 和 prod.py 4 个文件,每个文件中包含如下的一行代码:
from base import *

这样,这些环境配置文件就能读取默认的配置项了,之后就能在各自的配置文件中设置定制的配置值了。比如本地开发环境,可以在 dev.py 中添加 DEBUG=True**, 而生产环境 **prod.py**,可以设置 DEBUG=False`。

指定使用哪个配置文件:

可以通过操作系统的环境变量指定,比如:

export DJANGO_SETTINGS_MODELS="myproject.settings.prod"

也可以通过命令行参数指定, 比如:

./manage.py migrate --settings=myproject.settings.prod

或者

gunicorn -w 4 -b 127.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 和 code coverage。

以上针对 INSTALLED_APPS 的修改也可以针对 TEMPLATE_DIRS 和 MIDDLEMARE_CLASSES 进行。

4. 调整 pip requirements

项目一般都有一个 requirements.txt 文件,可以指定项目的依赖包,根据这个文件,可以用以下命令对依赖包进行自动安装:

pip install -r requirements.txt

在 requirements.txt 文件中可以用 -r filename 来包含进另一个文件的内容,这个功能和 C 语言中的 #include <filename.h> 类似。

因此,我们可以将通用的依赖信息保存在 myproject/requirements/base.txt 文件中,而针对不同的环境,比如测试环境,保存在另一个文件中,如 myproject/requirements/test.txt, 里面的内容可能会是:

-r base.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 应用,正确的方法是:

  1. 将 blog 应用提取出来,创建一个独立的代码库
  2. 在各个项目中,使用 pip install 的方式安装 blog 应用
  3. 在各个项目中,使用 pip 对依赖的 blog 进行更新

参考文献: http://www.revsys.com/blog/2014/nov/21/recommended-django-project-layout/

到此这篇关于Django 项目布局方法(值得推荐)的文章就介绍到这了,更多相关Django 项目布局方法(值得推荐)内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
Python3编程实现获取阿里云ECS实例及监控的方法
Aug 18 Python
使用 Python 玩转 GitHub 的贡献板(推荐)
Apr 04 Python
python打开windows应用程序的实例
Jun 28 Python
基于Python实现船舶的MMSI的获取(推荐)
Oct 21 Python
运行tensorflow python程序,限制对GPU和CPU的占用操作
Feb 06 Python
Python图像处理库PIL的ImageEnhance模块使用介绍
Feb 26 Python
Python使用GitPython操作Git版本库的方法
Feb 29 Python
Python切割图片成九宫格的示例代码
Mar 10 Python
Java Spring项目国际化(i18n)详细方法与实例
Mar 20 Python
浅谈matplotlib 绘制梯度下降求解过程
Jul 12 Python
粗暴解决CUDA out of memory的问题
May 22 Python
OpenCV-Python实现人脸美白算法的实例
Jun 11 Python
python实现吃苹果小游戏
Mar 21 #Python
python实现贪吃蛇游戏源码
Mar 21 #Python
python实现微信打飞机游戏
Mar 24 #Python
Python类的动态绑定实现原理
Mar 21 #Python
Python类和实例的属性机制原理详解
Mar 21 #Python
Python生成器常见问题及解决方案
Mar 21 #Python
Python作用域与名字空间原理详解
Mar 21 #Python
You might like
便携利器 — TECSUN PL-365简评
2021/03/02 无线电
php下一个阿拉伯数字转中文数字的函数
2007/07/16 PHP
smarty模板引擎基础知识入门
2015/03/30 PHP
详解php比较操作符的安全问题
2015/12/03 PHP
firefox firebug中文入门教程 脚本之家新年特别版
2010/01/02 Javascript
扩展JavaScript功能的正确方法(译文)
2012/04/12 Javascript
jQuery中on()方法用法实例详解
2015/02/06 Javascript
JavaScript原生对象之Number对象的属性和方法详解
2015/03/13 Javascript
原生JavaScript实现动态省市县三级联动下拉框菜单实例代码
2016/02/03 Javascript
JS实现iframe自适应高度的方法示例
2017/01/07 Javascript
Vue精简版风格概述
2018/01/30 Javascript
详解vue-cli脚手架中webpack配置方法
2018/08/22 Javascript
vue自定义指令实现仅支持输入数字和浮点型的示例
2019/10/30 Javascript
vue+axios全局添加请求头和参数操作
2020/07/24 Javascript
sqlalchemy对象转dict的示例
2014/04/22 Python
wxPython实现窗口用图片做背景
2018/04/25 Python
python 将md5转为16字节的方法
2018/05/29 Python
对python数据切割归并算法的实例讲解
2018/12/12 Python
用Python PIL实现几个简单的图片特效
2019/01/18 Python
python RC4加密操作示例【测试可用】
2019/09/26 Python
Python使用ElementTree美化XML格式的操作
2020/03/06 Python
python sitk.show()与imageJ结合使用常见的问题
2020/04/20 Python
python中rc1什么意思
2020/06/19 Python
Python matplotlib读取excel数据并用for循环画多个子图subplot操作
2020/07/14 Python
Python3爬虫中关于中文分词的详解
2020/07/29 Python
python-jwt用户认证食用教学的实现方法
2021/01/19 Python
HTML5 本地存储 LocalStorage详解
2016/06/24 HTML / CSS
html5 利用canvas手写签名并保存的实现方法
2018/07/12 HTML / CSS
eDreams加拿大:廉价航班、酒店和度假
2019/03/29 全球购物
Street One瑞士:德国现代时装公司
2019/10/09 全球购物
空字符串(“”)和null的区别
2012/11/13 面试题
What is view? why do we have view?
2012/06/22 面试题
如何进行Linux分区优化
2013/02/12 面试题
小学家长会邀请函
2014/01/23 职场文书
房产公证书
2015/01/23 职场文书
综合办公室主任岗位职责
2015/04/01 职场文书