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 相关文章推荐
Python第三方库xlrd/xlwt的安装与读写Excel表格
Jan 21 Python
开源Web应用框架Django图文教程
Mar 09 Python
Python3实现发送QQ邮件功能(文本)
Dec 15 Python
Python3之文件读写操作的实例讲解
Jan 23 Python
python PyTorch参数初始化和Finetune
Feb 11 Python
python实现批量解析邮件并下载附件
Jun 19 Python
python多线程调用exit无法退出的解决方法
Feb 18 Python
pycharm 安装JPype的教程
Aug 08 Python
利用Python绘制有趣的万圣节南瓜怪效果
Oct 31 Python
python数值基础知识浅析
Nov 19 Python
利用Python实现学生信息管理系统的完整实例
Dec 30 Python
python 邮件检测工具mmpi的使用
Jan 04 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
PHP5 的对象赋值机制介绍
2011/08/02 PHP
PHP利用MySQL保存session的实现思路及示例代码
2014/09/09 PHP
php 字符串中是否包含指定字符串的多种方法
2018/04/12 PHP
PHP用swoole+websocket和redis实现web一对一聊天
2019/11/05 PHP
PHP实现Snowflake生成分布式唯一ID的方法示例
2020/08/30 PHP
基于jQuery的ajax功能实现web service的json转化
2009/08/29 Javascript
JQuery上传插件Uploadify使用详解及错误处理
2010/04/27 Javascript
javascript获取select的当前值示例代码(兼容IE/Firefox/Opera/Chrome)
2013/12/17 Javascript
jQuery中的pushStack实现原理和应用实例
2015/02/03 Javascript
jquery实现表单输入时提示文字滑动向上效果
2015/08/10 Javascript
javascript常见数字进制转换实例分析
2016/04/21 Javascript
BootStrap的table表头固定tbody滚动的实例代码
2016/08/24 Javascript
JS实现点击Radio动态更新table数据
2017/07/18 Javascript
基于ES6作用域和解构赋值详解
2017/11/03 Javascript
vue.js模仿京东省市区三级联动的选择组件实例代码
2017/11/22 Javascript
150行Node.js实现的dns代理工具
2019/08/02 Javascript
JS实现扫码枪扫描二维码功能
2020/01/03 Javascript
vue列表数据发生变化指令没有更新问题及解决方法
2020/01/16 Javascript
Echarts在Taro微信小程序开发中的踩坑记录
2020/11/09 Javascript
Python中变量交换的例子
2014/08/25 Python
Python批量按比例缩小图片脚本分享
2015/05/21 Python
Python的条件语句与运算符优先级详解
2015/10/13 Python
Saltstack快速入门简单汇总
2016/03/01 Python
pygame加载中文名mp3文件出现error
2017/03/31 Python
基于Python3 逗号代码 和 字符图网格(详谈)
2017/06/22 Python
python3+PyQt5实现自定义分数滑块部件
2018/04/24 Python
PyTorch 解决Dataset和Dataloader遇到的问题
2020/01/08 Python
Python使用Turtle模块绘制国旗的方法示例
2021/02/28 Python
西班牙国家航空官方网站:Iberia
2017/11/16 全球购物
凯蒂·佩里个人女鞋品牌:Katy Perry Collections
2019/04/04 全球购物
关于.NET, HTML的五个问题
2012/08/29 面试题
乡镇办公室工作决心书
2014/03/11 职场文书
销售经理竞聘书
2014/03/31 职场文书
如何用PHP实现分布算法之一致性哈希算法
2021/05/26 PHP
Window server中安装Redis的超详细教程
2021/11/17 Redis
Spring IOC容器Bean的作用域及生命周期实例
2022/05/30 Java/Android