Two Scoops of Django 1.8 学习笔记一

前言

最近刚把Django的官方文档的重要部分看完,准备开始刷《Two Scoops of Django 1.8》这本书进行进阶,写的真的好好啊~

核心思想

  • Keep It Simple, Stupid
  • Fat Models, Utility Modules, Thin Views, Stupid Templates
  • Start With Django by Default
  • Be Familiar with Django’s Design Philosophies
  • The Twelve-Factor App

1. 编码风格

1.1 易读性

  • 避免简写的变量名
  • 写出你的函数变量名
  • 记录你的classes 和 methods
  • 给代码注释
  • 将重复的代码重构到函数或者方法里
  • 保持函数和方法的简短,一个好的检验方法是,不用滚动就可以看到整个函数或方法

1.2 参考PEP8 编码规范

  • 每层4个空格缩进
  • 每个class 间隔2行
  • class里的method间隔1行
  • 每行限制在79个字符以内

1.3 import顺序

  1. standard library
  2. core Django
  3. third-party App
  4. your apps

1.4 使用明确的相对的import

不要硬编码

from cones.models import Wafflecone

要介样

from .models import Wafflecone

1.5 避免使用import *

不要介样

from django.db.models import *

要介样

from django.db import models

1.6 Django Coding Style

  • Django官方代码风格
  • URL Pattern名 用下划线( _ )不要用破折号( - )
  • 模板名 用下划线( _ )不要用破折号( - )

1.7 选择一个 JS, HTML, CSS 代码样式手册

JS:

HTML CSS:

2. 最佳的 Django环境设置

  • 每个地方都使用同一个数据库引擎

    无论是本地开发环境还是生产环境都要保持使用同一种数据库引擎,
    很多开发者在开发环境使用SQLite3,而在生产环境使用PostgreSQL,这是非常不好的。

  • 用Pip 和 Virtualenv 进行环境隔离

  • 通过pip 安装django和其他依赖
  • 使用git当作版本控制

3. Django 项目布局

django默认的布局不咋地,
我们更倾向的项目布局是三层结构

  • repository_root
  • django_project_root
  • configuration_root

第一层repository_root是我们项目的绝对根目录,里面除了有django_project_root之外,
还有其他一些至关重要的组件,比如README.rst, docs/, gitignore, requirements.txt,
常见的错误是把django_project_root当作repository_root

第二层django_project_root才是我们的django项目目录,所有的python代码都应该在里面

第三层configuration_root是settings模块和 base URLConf(urls.py)放的地方,
他必须是一个有效的python包(里面有init.py)

一个例子

icecreamratings_project/
    .gitignore
    Makefile
    docs/
    README.rst
    requirements.txt
    icecreamratings/
        manage.py
        media/
        products/
        profiles/
        ratings/
        static/
        templates/
        config/
            __init__.py
            settings/
            urls.py
            wsgi.py

可以通过Cookiecutter生成项目样板

➜  ~  pip install cookiecutter
Collecting cookiecutter
  Downloading cookiecutter-1.0.0-py2.py3-none-any.whl
Collecting PyYAML>=3.10 (from cookiecutter)
  Downloading PyYAML-3.11.tar.gz (248kB)
    100% |████████████████████████████████| 249kB 550kB/s
Collecting mock (from cookiecutter)
  Downloading mock-1.3.0-py2.py3-none-any.whl (56kB)
    100% |████████████████████████████████| 57kB 1.6MB/s
Collecting click<4.0 (from cookiecutter)
  Downloading click-3.3-py2.py3-none-any.whl (58kB)
    100% |████████████████████████████████| 61kB 3.3MB/s
Collecting binaryornot>=0.2.0 (from cookiecutter)
  Downloading binaryornot-0.4.0-py2.py3-none-any.whl
Requirement already satisfied (use --upgrade to upgrade): jinja2>=2.7 in /usr/local/lib/python2.7/site-packages (from cookiecutter)
Collecting funcsigs (from mock->cookiecutter)
  Downloading funcsigs-0.4-py2.py3-none-any.whl
Requirement already satisfied (use --upgrade to upgrade): pbr>=0.11 in /usr/local/lib/python2.7/site-packages (from mock->cookiecutter)
Requirement already satisfied (use --upgrade to upgrade): six>=1.7 in /usr/local/lib/python2.7/site-packages (from mock->cookiecutter)
Requirement already satisfied (use --upgrade to upgrade): chardet>=2.0.0 in /usr/local/lib/python2.7/site-packages (from binaryornot>=0.2.0->cookiecutter)
Requirement already satisfied (use --upgrade to upgrade): markupsafe in /usr/local/lib/python2.7/site-packages (from jinja2>=2.7->cookiecutter)
Requirement already satisfied (use --upgrade to upgrade): pip in /usr/local/lib/python2.7/site-packages (from pbr>=0.11->mock->cookiecutter)
Installing collected packages: PyYAML, funcsigs, mock, click, binaryornot, cookiecutter
  Running setup.py install for PyYAML
Successfully installed PyYAML-3.11 binaryornot-0.4.0 click-3.3 cookiecutter-1.0.0 funcsigs-0.4 mock-1.3.0
➜  ~  cookiecutter https://github.com/pydanny/cookiecutter-django.git
Cloning into 'cookiecutter-django'...
remote: Counting objects: 3385, done.
remote: Compressing objects: 100% (138/138), done.
remote: Total 3385 (delta 81), reused 0 (delta 0), pack-reused 3244
Receiving objects: 100% (3385/3385), 643.77 KiB | 247.00 KiB/s, done.
Resolving deltas: 100% (2042/2042), done.
Checking connectivity... done.
project_name (default is "project_name")? balala
repo_name (default is "balala")? snir
author_name (default is "Your Name")? chencheng
email (default is "Your email")? chan4aaron@163.com
description (default is "A short description of the project.")? just for fun
domain_name (default is "example.com")? morningchen.com
version (default is "0.1.0")?
timezone (default is "UTC")? Asia/Shanghai
now (default is "2015/01/13")? 2015/09/06
year (default is "2015")?
use_whitenoise (default is "y")? n
use_celery (default is "n")? y
use_maildump (default is "n")? y
use_sentry (default is "n")? y
windows (default is "n")?
➜  ~  cd snir

现在一个完整的项目模板就生成了。

4. Django APP设计基础

对一个新手开发者来说,常常会对django的’app’这个单词产生疑惑,
在我们深入app设计之前,明确一些定义非常重要。

  • A Django project: 由django框架驱动的一个网页应用程序
  • Django apps: 代表项目一个方面的小型库
  • INSTALLED_APPS: setting中的app list
  • Third-party Django packages: 已经被python打包工具打包好的简洁,可插拔,可复用的django apps

Django App设计的黄金定律

Write program do one thing and do it well.

其本质就是每个app只专注它自己的任务,如果一个app你不能用一句简单的话概括,
那可能意味着这个app太大了,你需要打散它。

如何命名你的Django app

每个人都有自己的编码风格,有的人喜欢用炫酷的命名,我们更倾向于平淡,显而易见的命名。
比如说flavors, animals, blog, polls, dreams, estimates, finances。

一个棒棒的,显而易见的app命名让这个项目更易于维护.使用有效的、遵循PEP8规范的命名:简短、小写,不要有数字、破折号、句号、空格和其他特殊字符。
可以使用下划线让单词的易读性更强

5. 配置文件和依赖文件

我们应该遵循以下最佳实现:

  • 所有的配置文件都要有版本控制
  • Don’t repeat yourself (DRY原则)
  • 保证secret key 安全(一定一定一定要把他隔离在版本控制器的外面!!!!!!)

配置文件

为了隔离开发环境和生产环境的配置文件,用settings/文件夹取代settings.py

settings/
    __init__.py
    base.py
    local.py
    staging.py
    test.py
    production.py
  • base.py 共用的配置文件
  • local.py 本地开发环境的配置文件,不同于production.py的是里面有DEBUG模块,像django-debug-toolbar这样的日志级别的开发者工具
  • staging.py 在网站生产服务器上跑的半私人化的版本
  • test.py 跑测试用的
  • production.py 生产环境下的配置文件

运行本地脚本和服务器

python manage.py shell --settings=twoscoops.settings.local
python manage.py runserver --settings=twoscoops.settings.local

有时候一个大项目,不同的开发者有不同的配置,但是他们共用一个dev.py文件。
所以我们可以给不同的开发者设置不同的配置文件。

settings/
    __init__.py
    base.py
    local.py
    staging.py
    test.py
    production.py
    dev_cc.py
    dev_audreyr.py

dev_cc.py 和 dev_audreyr 分别是cc和audreyr这两位开发者的配置文件,
这样就解决了这个问题,并且项目组成员还可以互相检查看看谁缺少了什么至关重要的组件

从代码中隔离出下面的配置,比如说:

  • 数据库,Memcached,以及其他 后端服务 的配置
  • 第三方服务的证书,如 Amazon S3、Twitter 等
  • 每份部署特有的配置,如域名等

配置文件遵循以下原则

依赖文件

依赖文件requirements.txt可以用文件requirements/代替,
以区分本地和生产环境,结构如下

requirements/
    base.txt
    local.txt
    staging.txt
    production.txt

下面是local.txt的内容

-r base.txt
django-debug-toolbar==1.3.0

安装本地环境依赖:

$ pip install -r requirements/local.txt

setting里的文件路径

MEDIA_ROOT, STATIC_ROOT, TEMPLATES等等不要硬编码

用django的第三方app django-environ可以很好的解决这个问题,
具体用法看官方说明

如果我的文章对你有很大帮助 那么不妨?
0%