2 最优Django环境配置

本章描述了我们认为对于中等和高级Django使用者来说最优的本地环境配置

2.1 统一使用相同的数据库引擎

一个常见的开发者错误是在本地开发环境中使用SQLite3,而在生产环境中使用PostgreSQL(或MySQL)。本节的提示不仅仅适用于使用SQLite3和PostgreSQL这种种的情景,而是适用于任何你使用两种数据库却希望它们行为特性一致的情景。

下面是一些我们在开发和生产使用不同数据库时碰到的问题:

2.1.1 你不能在本地对线上数据的完整Copy做数据检查

当你的线上生产数据库和你的本地开发测试数据库不一样的时候,你就不能在本地数据库中对线上生产数据库的数据做完全复制,也就无法在本地做完整的数据检查。

当然你可以对线上数据库做一个SQL Dump,然后运行这些SQL把数据导入你的本地数据库,但是这不意味者你通过这样的导入导出得到的是线上数据的完整复制。

2.1.2 不同的数据库有不同的字段类型和数据约束

请牢记:不同的数据库可处理的数据字段的类型是不同的。Django的ORM努力去适配兼容这些不同的数据类型,但是其所能做的,也只有这么多。

比如:有些人在本地使用SQLite数据库,在线上生产环境用PostgreSQL数据库。他们认为Django ORM可以让他们不用考虑不同数据库的特性差异,最终他们都会陷入麻烦:因为SQLite是动态的弱类型,而不是PostgreSQL的强类型。

当然,Django ORM可以帮助你的代码以强类型的方式操作SQLite,但是表单和数据验证的错误在开发阶段不会被捕捉到,直到代码上线才会被发现。比如你在本地可以毫无障碍的存储长字符串,因为SQLite3不在乎这个,但是在生产环境里,你的PostgreSQL或mysql会报出约束错误,这些错误你在本地测试环境中不会发现,你将很难重现这些问题,直到你建立一致的本地测试环境为止。

大多数问题都不会被发现,直到项目跑在一个强类型的数据库上(比如PostgreSQL或MySQL),当这些类型的bug发生时,你应该结束自责,努力在本地开发环境中搭建正确的数据库。


提示:Django+PostgreSQL组合

据我们所知,大多数Django开发者在所有的环境优先使用PostgreSQL,这些环境包括开发环境、演示环境、QA环境、生产环境。

根据你的操作系统,可以使用以下操作

你也许得花些功夫才能让PostgreSQL本地运行在某些操作系统上,但是你会发现花这些功夫是值得的。


2.1.3 固定数据(Fixtures)不是魔法解决方案

你也许想知道为什么不采用固定数据来使本地数据库和生产数据库的区别透明化。

对,固定数据在提供简单硬代码测试数据集方面是非常优秀的。有时你需要在开发中用假的测试数据填充你的数据库,特别是在早期项目的演示阶段

固定数据不是一个在数据库之间移植大量数据集的可信工具,它是一个具体数据库不明确的方式,它们根本就不应该那么用。不要错以为固定可以用来做在生产数据库和其他数据库之间移植数据的基础数据工具(dumpdata/loaddta)

2.2 使用Pip和Virtualenv

如果你目前还没用这它们,我们强烈建议你熟悉这两个工具。对于Django项目来说,它们是事实上的标准配置,大多数使用Django的公司都依赖于者两个工具

Pip是一个从Python包目录(Pypi)及其镜像获取python包的工具.它用来管理和安装Python包,它和easy_install很像,不过有更多特性,关键的一个特性是支持Virtualenv。

Virturlenv是一个可以用来创建相互独立的Python环境的工具,这些独立的环境可以有不同的包依赖体系。当你同时开发多个项目且不同的项目依赖不同的包版本库时,你应该考虑使用Vitualenv。

举个例子:假设你开发两个项目,其中一个依赖Django1.7,一个依赖Django1.8.

  • 如果没有使用Vituraenv(或者其他管理包依赖的替代工具),你将不得不在每次切换项目时重装Django。
  • 如果你觉得这繁琐无用,请注意:大多数实际Django生成项目至少需要依赖12个以上的包。

Pip已经包含在Python3.4以及更新版本,深度阅读以及安装指令可以在以下页面找到:


提示:virtualenvwrapper

我们为Mac OS X和Linux系统用户高度推荐virtualenvwrapper,为Windows系统用户推荐virtualenvwrapper-win,这些项目都是由Doug Hellman 发起。

就个人意见,我们一般认为不带virtualenvwrapper使用virtualenv真是一种痛苦,因为当你每次想激活一个virtualenv环境的时候,你将不得不输入以下这个长命令?

Example 2.1

$ source  ̃/.virtualenvs/twoscoops/bin/activate

使用virtualenvwrapper,你只需要输入:

Example 2.2

$ workon twoscoops

Virtualenvwrapper是一个pip和vituralenv的流行搭配工具,它使我们的输入更简单,但它不是绝对必须的。


图2.1:Pip、virtualenv和virtualenvwraper之间关系以雪糕的形式的说明图---图找原版看吧。

2.3 通过Pip安装Django及其他依赖

Django官方文档描述了几种安装Django的方式。我们推荐的方法是通过pip和必需清单文件的方法。

概要描述一下工作过程:一个必需清单文件就像一个Python包的清单,包含了你想要装的所有Python包,它包含每个包的名字和版本,你可以使用pip从这个清单文件安装所需包到你的virturlenv环境。

这个清单文件设置安装的内容我们将在第五章的配置与所需清单文件中谈及。


提示:配置PYTHONPATH

如果你对命令行以及环境变量的知识掌握比较牢靠的话,你可以设置你的virtualenv环境的PYTHONPATH变量以便django-admin.py可以正常启动站点及执行其他任务。

你也可以通过pip的最新版本设置你的PYTHONPATH变量包含当前目录。在项目的根目录运行“pip install -e .”命令是把当前目录作为适时编辑的包的一个技巧。

如果你不知道如果设置或者你觉得上面内容有点复杂,别担心,坚持使用manage.py就可以了。

推荐阅读:


2.4 使用版本控制系统

版本控制系统一般用来做版本控制以及代码管理。任何时候,当你开发Django项目时,你都应该使用一个版本控制系统跟踪你的代码变更。

维基百科有不同版本控制系统的详细对比:

所有可选方案中,Git和和Mercurial似乎在Django开发者当中最流行。这两个都可以很容易地创建分支和合并变更。

当使用版本控制系统时,最重要的是不近要有你代码库的本地版本,而且要有一个版本控制主机服务作为备份。为此我们建议你使用GitHub(https://github.com/)或者Bitbucket(https://bitbucket.org/).

2.5 完全一致的环境

在一个程序员的笔记本上可运行的也许在生产环境不能正常工作。但是如果你的本地开发环境和项目的演示环境、测试环境、开发环境完全一致,那会怎样哪?

当然,如果你的生产环境体系架构包含10000个服务器,另外拿10000个本地服务器用作开发环境用途完全不可能。所以当我们说一致的时候偶,是指尽实际可能保持一致。

有几个环境特性差异我们可以评估一下:

操作系统不同. 如果我们开发是在Mac或者Windows上,站点是部署在Ubuntu linux上,那么Django项目在这两种环境下的工作机制差别是很大的。

Python安装配置不同.让我们正面这个问题,很多开发者和系统管理员甚至都不确定他们的机器上安装的Python的版本,尽管没人承认这个问题。为什么?因为正确的配置Python环境和完全理解你的配置是有点难的。

开发者之间的差异. 在一个大型开发团队里,大量的时间都浪费在调试开发者之间的环境配置差异。

配置一直的开发环境的同行方法是使用Vagrant和ViturlBox.

2.5.1 Vagrant和VitualBox

Vagrant是一个用来创建、配置、管理可复制的开发环境的流行工具.Vagrant的最大优势是它使得使用VitualBox(和其他VM工具)变得非常容易.

比如,如果你的开发笔记本是OS X系统,但是你的项目配置是面向Ubuntu的,我们可以使用Vagrant和项目的Vagrant文件在本地快速搭建一个虚拟的Ubuntu开发环境配置,环境中会自动带有所有的依赖包和所需的安装配置。

  • 为你项目组的所欲开发人员搭建一致的本地开发环境
  • 把这些本地环境环境的配置做成与你的演示、测试、生产环境的配置做成高度相似或一致的。
  • 外部的复杂性大多数时候是无需考虑的,简单的项目大多不用考虑操作系统级的差异,一般可以忽略不计。
  • 在旧的开发机器上跑虚拟机实例会使系统性能慢如蜗牛爬行一般,甚至在新一点的机器上都会感到微小但明显可感知的系统开销

试验:使用隔离的Docker容器环境

使用docker与在虚拟机下开发有点像,当然Docker更轻量级一点。Docker容器环境共享宿主OS环境,但是有它自己隔离的进程和内存空间。更进一步讲:因为Docker使用AUFS(译注:一种高级多层的统一文件系统),容器可以快速构建带有附加差量的快照,而不是从头构建。

在Eventbrite,架构团队使用于Vagrant连接的Docker来加速开发虚拟机的供给.然而,Docker仍旧在快速发展所以只是在研究试验阶段.


2.6 总结

这一章的内容包块在开发和生产环境中使用系统的数据库,以及使用pip、vitualenv和版本控制系统。这些都是好东西,应该放进你的工具箱,因为它们不止在Django中使用,而且在大多数Python软件开发中使用。

最优Django环境配置的更多相关文章

  1. Python Virtualenv运行Django环境配置

    系统: RHEL6.5 版本说明: Python-3.5.0 Django-1.10.4 virtualenv:为每个项目建立不同的/独立的Python环境,你将为每个项目安装所有需要的软件包到它们各 ...

  2. Django环境配置

    Django安装 #安装最新版本的Django $ pip install django #或者指定安装版本 pip install -v django==1.7.1 项目创建 $ django-ad ...

  3. Nginx+uWSGI+Django环境配置

    通常项目会部署在虚拟环境,虚拟环境的使用可以参考这里,点击前往 当然你也可以直接部署,这里不多说. 一.安装uWSGI 1.通过pip安装 pip install uwsgi 这里只说明了一种安装方式 ...

  4. 如何用Python做Web开发?——Django环境配置

    用Python做Web开发,Django框架是个非常好的起点.如何从零开始,配置好Django开发环境呢?本文带你一步步无痛上手.     概念 最近有个词儿很流行,叫做“全栈”(full stack ...

  5. django 环境配置.

    1. 一个虚拟环境对应一个 dajngo项目 2. mkvirtruenv pycham 创建Pure Python 新项目,不是Django 2018.3 其他版本 3.  Add Configur ...

  6. python and pycharm and django 环境配置

    python 安装   https://www.python.org/ 我的是win7 32位,下载exe文件傻瓜式安装…… cmd 输入命令 python  则安装成功 如果不能进入,则有可能是环境 ...

  7. linux+nginx+python+django环境配置

    Django是一个开放源代码的Web应用框架,由Python写成,它最初是被开发来用于管理劳伦斯出版集团旗下的一些以新闻内容为主的网站的.python+django也是web开发者最受欢迎的框架.今天 ...

  8. 记一次Suse下的Django环境配置——第一弹

    一.安装Python 由于原有Suse自带的Python版本只有2.4,因此首先需要安装Python的高版本,在这里我选择使用Python2.7.9.PS:之前选择使用2.7.11版本,由于没有zli ...

  9. Windows 下 Django/python 开发环境配置

    1.安装 Aptana/Eclipse Aptana是在eclipse上二次开发的一个开源的集成开发环境,内置python编译器 http://www.aptana.com/ 2. 安装python ...

随机推荐

  1. ASP.NET MVC之Unobtrusive Ajax(五)

    前言 这一节我们来讲讲Unobtrusive中的Ajax提交,大部分情况下我们是利用JQuery来进行Ajax请求,当然利用JQuery来进行表单Ajax请求也不例外,但是相对于Unobtrusive ...

  2. jquery 基础-Ajax应用

    使用load()方案异步请求数据 调用格式:load(url,[data],[callback]) 参数url为加载服务器地址,可选项data参数为请求时发送的数据,callback参数为数据请求成功 ...

  3. 双等位基因(biallelic sites )和多等位基因(multiallelic sites)

    双等位基因(biallelic sites ):表示在基因组的某个位点上有两个等位基因,如下图第七个位点所示,有G/-两种形式: 多等位基因(multiallelic sites):表示在基因组的某个 ...

  4. Jade之Extends

    Extends jade允许多个jade文件继承一个jade文件. jade: //- layout.jade doctype html html head block title title Def ...

  5. Jsoup开发简单网站客户端之读取本地html文件

    用jsoup解析网页,相比于那些返回api数据来说 肯定耗流量,加载慢,所以程序assts中预先放了一个最新的html文件,第一次进来不走网络,直接从本地取,以后会加上wifi离线功能. 首先离线网站 ...

  6. svn update -r m path 代码还原到某个版本(这样之前的log日志也就没了,也就是清空log日志)

    [root@ok 资料库]# svn log 简历 ------------------------------------------------------------------------ r ...

  7. Android 中Service生命周期

    使用context.startService() 启动Service 其生命周期为context.startService() ->onCreate()- >onStart()->S ...

  8. android 点击edittext弹出软键盘,否则不弹

    只需要加android:windowSoftInputMode="stateHidden|stateAlwaysHidden"就可以 如:<activity android: ...

  9. DHTMLX 前端框架 建立你的一个应用程序 教程(五)--添加一个表格Grid

    表格例子 样本如下: 我们这篇介绍的是dhtmlxGrid  组件. 它支持4种数据格式:XML, JSON, CSV, JSArray. 添加表格到布局的单元格中去: 1.使用attachGrid( ...

  10. hdu2095 像水题的不错题 异或运算

    异或运算的基础有点忘记了 先介绍一下..2个数异或 就是对于每一个二进制位进行位运算 具有2个特殊的性质 1.一个数异或本身恒等于0,如5^5恒等于0: 2.一个数异或0恒等于本身,如5^0恒等于5. ...