项目开始时是一个关键时刻,选择会对项目产生长期的影响。有很多关于如何开始使用Django框架的教程,但很少讨论如何专业地使用Django,或如何使用行业公认的最佳做法来确保你的项目规模的持续增长。事前的筹划让你(和所有同事的生活)在走向将来时更容易。
文章结束时,你将有
一个全功能的Django 1.6项目
除第一部在官方教程中外其他部分教程里都没有。它们应该这样。如果你想开始一个新的、生产就绪的Django 1.6项目,请继续往下看。
先决条件
假定你已了解Python的基本知识,同时,以往的一些Django经验会有帮助,但这不是必要的。你需要git或Mercurial来进行版本控制。就这些!
准备安装
我假设你已经安装了Python。如果你没有的话到python.org找到与你系统架构相符的版本下载安装。我使用一个Linode上的64位的Ubuntu服务器,我很高兴使用Linode的服务。
那么,第一步是什么呢?安装Django?不完全是。将安装包直接安装到你当前的site-packages里有一个常见的问题:如果你的机器上有一个以上的Python项目使用Django等其他库,你可能会碰到应用和安装软件库之间依赖性的问题。因此,我们将使用virtualenv和它的延展virtualenvwrapper来管理我们的Django安装。这是Python和Django用户的实践建议。
如果你使用pip来安装第三方库(我不明白你为什么不),你可以通过简单的操作安装virtualenv和virtualenvwrapper。
$ pip install virtualenvwrapper
安装完后,将下附内容添加到你的shell启动配置文件中(.zshrc、.bashrc、.profile等)
复制代码 代码如下:
export WORKON_HOME=$HOME/.virtualenvsexport PROJECT_HOME=$HOME/directory-you-do-development-insource /usr/local/bin/virtualenvwrapper.sh
重载一下你的启动配置文件(source .zshrc),现在你已经就绪了。
创建一个新环境
创建一个虚拟环境很简单,只需输入
$ mkvirtualenv django_project
"django_project"是你的项目的命名。
你会注意到立马发生的一些事情:
你的shell前面加上了"(django_project)"
distribute和pip被自动安装了
这里是virtualenvwrapper的一个很有用的部分:它会自动为你准备好环境,让你马上可以使用pip安装库。"(django_project)"的部分是提醒你正在使用的是virtualenv而不是你系统上的Python。要退出虚拟环境只需简单输入deactivate即可。当你要回到你的项目开始工作时,只需使用workon django_project即可。需要注意的是这与vanilla virtualenv工具不同,在哪里运行这些命令都可以。
安装Django
"等一下,'安装Django'?我已经安装Django了!",太好了。不过你不会用它的。相反,我们将使用机器上的一个被virtualenv管理的且不会被其他用户(或你自己)弄乱的Django安装。在virtualenv中安装Django,只需输入:
$ pip install django
这样最新版的Django将被安装在你的virtualenv环境里,你可以这样确认:
$ which django-admin.py
这会指出你的$HOME/.virtualenvs/目录。如果没有的话,确认你的输入提示里有"(django_project)"。如果没有,使用workon django_project激活virtualenv。
建立项目
在我们真正开始这个项目之前,我们先来谈一谈。我在过去的几年里咨询过很多Django/Python项目并且和许多开发者讨论过。一个具有压倒性的事实是,那些具有最多困难的事情往往都没有使用任何的版本控制。这听起来让人难以置信(想想GitHub的流行程度吧),但是开发者们根本不会去接触版本控制。也有一些人认为"这是个小项目",没有必要使用版本控制。这是错误的。
这里列出的工具不会让你为了使用版本控制而增加更多额外的支出。
之前,我只提到过git作为(D)VCS。但是,既然这个项目是Python写的,Mercurial也是一个基于Python的不错的选择。因为两者都比较流行,所以你能找到许多在线学习资源。确保你已经安装了git或者Mercurial。两者都可以通过你的distro's packaging系统获取它们。
如果你打算用git,GitHub显然是一个很好的选择可以把你的代码保存到远程仓库里。使用Mercurial的话, Atlassian的Bitbucket是一个不错的选择(它也支持git,所以你用git或者Mercurial都行)
(源码)控制你的环境
即使我们还没真正做什么,但我们知道我们想让所有东西都在源码控制下。我们有两类"东西"将提交:你的代码本身(包括模板,等等)和支持文件,像数据库夹具、South迁移(以后会更多)和requirements.txt文件,列出你的项目依赖的所有包,允许自动构建环境(不需要再次使用pip install安装所有包)。
让我们开始创建我们的项目文件夹。使用django-admin.py提供的startproject命令来设置。
$ django-admin.py startproject django_project
我们将看到创建了一个单独的文件夹:django_project。在django_project文件夹内,我们将看到 另一个包含了常见元素的django_project文件夹:setting.py,urls.py和wsgi.py。在第二个django_project文件夹的同一级内有manage.py文件。
插曲:项目vs.应用程序
你也许会好奇,在Django1.4中,为什么已经有了新建应用程序的命令还要增加新建项目的命令。答案在于Django"项目"和Django"应用程序"的区别。简单来说,一个项目是一套完整的网站或者应用。一个"应用程序"是一个可以用在任何Django项目中的很小的、(希望是)独立的Django应用。如果你正在构建一个叫做"超级博客"的博客应用,那么"超级博客"就是你的Django项目。如果"超级博客"支持读者投票,那"投票"就是被"超级博客"使用的一个Django应用程序。这个概念就是需要你的投票应用程序可以应用在其他需要用户投票的Django项目中,而不是仅能应用在"超级博客"项目中。一个项目就是一堆应用程序按照项目特定的逻辑构建的一个集合。一个应用程序可以应用在多个项目中。
尽管你会本能地倾向于在你的"投票"应用程序中包含大量"超级博客"的特定代码和信息,但避免这样有许多好处。基于松耦合的原理,将你的应用编写为一个独立的实体可以保持设计意图,并且可以避免项目里的bug直接影响到你的应用。这也意味着,如果你希望的话,你可以把你的任何应用程序发给另一个开发者,且他们不需要访问或更改你的主项目。
像软件开发中的许多事情一样,这需要一点付出,但回报很丰厚。
创建仓库
现在我们的项目里已经有一些"代码"了(确实来说只是一些股票脚本和空的配置文件,恕我这样说),现在是我们初始我们源码控制库再好不过的时间了。下面是在Git和Mercurial中实现的步骤。
git
$ git init
这条命令在当前目录创建了一个git仓库。将我们所有的文件添加到git以便提交。
$ git add django_project
现在,我们将代码切实提交到我们的新库中:
$ git commit -m 'Initial commit of django_project'
Mercurial
$ hg init
这条命令在当前目录创建了一个Mercurial仓库。将我们所有的文件添加到git以便提交。
$ hg add django_project
现在,我们将代码切实提交到我们的新库中:
$ hg commit -m 'Initial commit of django_project'
如果你打算使用像GitHub或者Bitbucket,现在是时候把代码push上去了。
使用South进行数据库迁移
Django中最令人沮丧的特性之一是管理模型的变化和数据库的相关变化。有了South的帮助,你可以实现创建一个完整的应用,而不需要写具体的数据库代码。South会创建一个迁移文件来检测你的模型变化,并自动在数据库中生成。这使得你既可以前向根据最新变化来迁移数据库,又可以后向取消一个变化或者一系列变化。它让你的生活如此简单,Django发行版没有包含它真让人吃惊。
何时开始使用South
在前面的文章中,我建议在项目的一开始就使用South。对于相对简单的项目而已,这挺好。然而,如果在你的原型中有大量的模型有很大的变化,那现在不是使用South的时候。对应的,仅仅丢掉并在需要时重建数据库。你可以编写脚本来构成拥有一些测试数据的数据库,并在需要时编辑它们。然而,一旦你的模型不再变化,尽快开始使用South。这很简单:
./manage.py convert_to_south <app_name>
安装和设置
仍然在我们的虚拟环境下,像这样安装South:
$ pip install south
我们在项目的settings.py文件中把South添加到INSTALLED_APS中。现在就添加,包括你的项目中的数据库设置,然后运行python manage.py syncdb。你将需要提升权限使用超级用户名和密码(你可以输入然后回车)。更重要的是,South已经在数据库中设置好了它需要用的表格。
你可能认识到我们并没有在项目中添加应用,而只是运行了 syncdb。先这样做可以让 South 在一开始的时候就被安装。使用 South,在我们应用中的所有迁移工作都可以完成,包括初始迁移。
由于我们刚刚完成了很多变更,现在将是一个提交的好时间。你得适应频繁的提交,要知道,提交的粒度越小,在出错时回退的自由度越高。
要进行提交操作,让我们看看都有那些修改。
(git)
$ git status
# On branch master
# Changes not staged for commit:
# (use "git add <file>..." to update what will be committed)
# (use "git checkout -- <file>..." to discard changes in working directory)
## modified: django_project/settings.py
## Untracked files:
# (use "git add <file>..." to include in what will be committed)
## django_project/.settings.py.swp
# django_project/__init__.pyc
# django_project/settings.pyc
(Mercurial)
$ hg status
M django_project/django_project/settings.py
? django_project/django_project/.settings.py.swp
? django_project/django_project/__init__.pyc
? django_project/django_project/settings.pyc
使用 git 和 Mercurial,你可能发现一些你永远都不希望提交的文件,例如上面出现的 python 编译 后的 .pyc 文件,以及 vim 的.swp 交换文件。要忽略这些文件,在项目的根目录中创建一个 .gitignore 或 .hgignore 文件,并在其中添加匹配你不希望追踪的文件的 shell 模式。例如,我的文件内容多半就是:
?
复制代码 代码如下:
.pyc.swp
在我们提交之前,还有一个信息需要查看:我们已经安装的 Python 包。我们希望能够追踪使用到的 Python 包的名称和版本,这样一来,我们就可以轻松的重建生产环境。pip 正好有个命令可以完成我们这个需求。
$ pip freeze > requirements.txt
我将 pip 的输出存入名为 requirements.txt 的文件,并将这个文件添加到代码控制中。这样,我们总是拥有一个更新的列表,里面包含了将使用的包。
现在将 settings.py 及 requirements.txt 添加到提交文件中,并提交:
$ (git/hg) add django_project/settings.py requirements.txt
$ (git/hg) commit -m 'Added South for database migrations'
新型设置
随着开发者对Django和Python越来越舒适,他们会发觉settings.py就是个简单的Python脚本,因此可以"编写"。对settings.py的一个常见方式是从一个颇为古怪的项目文件夹移动到一个新的叫做conf或者config的文件夹。要清楚你需要对manage.py做些小改变来适应这个移动。
在setting.py内,INSTALLED_APPS会很快变成一堆第三方的包,自身django应用和项目特定的应用。我习惯把INSTALLED_APPS分成三个类别:
DEFAULT_APPS:作为默认Django安装(像admin)的一部分的Django框架应用
这可以更容易的看出哪些是你使用的第三方应用,哪些是项目自身的。仅仅记住最后有一行和下面相似的代码:
INSTALLED_APPS = DEFAULT_APPS + THIRD_PARTY_APPS + LOCAL_APPS
否则,Django将会出现没有定义INSTALLED_APPS的错误。
创建我们的应用
以正常的方式使用manage.py来创建一个应用(python manage.py startapp myapp),并把它加入到INSTALLED_APP中。同时,花费时间让manage.py可执行(chmod +x manage.py),这样你就可以仅仅输入./manage.py
在添加模型前,我们要做的第一件事是我们告诉South我们想用它做迁移:
$ python manage.py schemamigration myapp --initial
这将创建一个移植文件,用来应用我们对于数据库的模型更改(如果我们有的话),而不需要完全销毁再重建它。当情况偏离时,它也可以让我们用来 恢复更改。我们使用移植文件来 移植数据库的变化(即使还没有变化),命令如下:
$ python manage.py migrate myapp
South足够智能,知道去哪里找到移植文件,也记得我们做的最后的移植。你可以指定单独的移植文件,但这一般并不是必须的。
当我们最终对模型做出改变时,我们使用下面的命令来让South创建一个移植文件:
$ python manage.py schemamigration myapp --auto
这将检测myapp中的模型,并自动相应的添加、删除或修改数据库中的表。然后使用如上的移植命令就可以将改变应用到数据库上。
开发区域
还有一件事你需要注意:将开发区域与你已经确认的文件区分开,原因显而易见。使用Git和Mercurial实现这个很简单,而且也有助于部署。创建django_project所在目录之外的一个目录作为你开发区域(我把它叫做dev)。
在你的开发目录,使用git或Mercurial克隆当前项目:
$ (git/hg) clone /path/to/my/project/
两个工具都将创建库的一份完整拷贝。所有的更改、分支及历史都将在新库中可用。从现在起,你应该在你的开发目录工作。
由于使用Git和Mercurial来进行分支都容易便捷,当你切换新分支或站点的大规模变化时创建分支。下面是两个工具的实现方法:
(git)
$ git checkout -b <branchname>
这不仅创建了一个命名新分支且会将代码检出。几乎所有的开发工作都应该在分支上,这样主分支可以随时恢复。
(Mercurial)
$ hg branch <branchname>
请注意,在Mercurial社区里分支是一个有争议的话题,目前这里有一些可用的选项,但其中还没有"显然正确"的。在这里,我使用命名分支,这可能是最安全且最有益的分支风格。任何在branch命令后的提交将在新分支生效。
使用 Fabric 来进行部署
那么我们就有了一个Django应用。我们怎么来部署它呢?Fabric。对一个合理大小的项目来说,讨论任何其它的东西都是浪费时间。Fabric可用于许多种不同目的,不过在部署方面它确实很出色。
$ pip install fabric
Fabric 需要一个名为fabfile.py的 fabfile 文件,这个文件定义了所有我们可以采用的动作。现在我们就来创建它。将下面这些内容写入fabfile.py并将其放到项目的根目录。
from fabric.api import localdef prepare_deployment(branch_name):
local('python manage.py test django_project')
local('git add -p && git commit') # or local('hg add && hg commit')
这样就会运行这个测试并提交你的变更,但是提交只在测试通过的条件下发生。在此处,生产环境中一个简单的"pull"动作都可以成为实际部署。我们给实际部署再增加一些东西。将以下内容增加到fabfile.py:
京东创始人刘强东和其妻子章泽天最近成为了互联网舆论关注的焦点。有关他们“移民美国”和在美国购买豪宅的传言在互联网上广泛传播。然而,京东官方通过微博发言人发布的消息澄清了这些传言,称这些言论纯属虚假信息和蓄意捏造。
日前,据博主“@超能数码君老周”爆料,国内三大运营商中国移动、中国电信和中国联通预计将集体采购百万台规模的华为Mate60系列手机。
据报道,荷兰半导体设备公司ASML正看到美国对华遏制政策的负面影响。阿斯麦(ASML)CEO彼得·温宁克在一档电视节目中分享了他对中国大陆问题以及该公司面临的出口管制和保护主义的看法。彼得曾在多个场合表达了他对出口管制以及中荷经济关系的担忧。
今年早些时候,抖音悄然上线了一款名为“青桃”的 App,Slogan 为“看见你的热爱”,根据应用介绍可知,“青桃”是一个属于年轻人的兴趣知识视频平台,由抖音官方出品的中长视频关联版本,整体风格有些类似B站。
日前,威马汽车首席数据官梅松林转发了一份“世界各国地区拥车率排行榜”,同时,他发文表示:中国汽车普及率低于非洲国家尼日利亚,每百户家庭仅17户有车。意大利世界排名第一,每十户中九户有车。
近日,一项新的研究发现,维生素 C 和 E 等抗氧化剂会激活一种机制,刺激癌症肿瘤中新血管的生长,帮助它们生长和扩散。
据媒体援引消息人士报道,苹果公司正在测试使用3D打印技术来生产其智能手表的钢质底盘。消息传出后,3D系统一度大涨超10%,不过截至周三收盘,该股涨幅回落至2%以内。
9月2日,坐拥千万粉丝的网红主播“秀才”账号被封禁,在社交媒体平台上引发热议。平台相关负责人表示,“秀才”账号违反平台相关规定,已封禁。据知情人士透露,秀才近期被举报存在违法行为,这可能是他被封禁的部分原因。据悉,“秀才”年龄39岁,是安徽省亳州市蒙城县人,抖音网红,粉丝数量超1200万。他曾被称为“中老年...
9月3日消息,亚马逊的一些股东,包括持有该公司股票的一家养老基金,日前对亚马逊、其创始人贝索斯和其董事会提起诉讼,指控他们在为 Project Kuiper 卫星星座项目购买发射服务时“违反了信义义务”。
据消息,为推广自家应用,苹果现推出了一个名为“Apps by Apple”的网站,展示了苹果为旗下产品(如 iPhone、iPad、Apple Watch、Mac 和 Apple TV)开发的各种应用程序。
特斯拉本周在美国大幅下调Model S和X售价,引发了该公司一些最坚定支持者的不满。知名特斯拉多头、未来基金(Future Fund)管理合伙人加里·布莱克发帖称,降价是一种“短期麻醉剂”,会让潜在客户等待进一步降价。
据外媒9月2日报道,荷兰半导体设备制造商阿斯麦称,尽管荷兰政府颁布的半导体设备出口管制新规9月正式生效,但该公司已获得在2023年底以前向中国运送受限制芯片制造机器的许可。
近日,根据美国证券交易委员会的文件显示,苹果卫星服务提供商 Globalstar 近期向马斯克旗下的 SpaceX 支付 6400 万美元(约 4.65 亿元人民币)。用于在 2023-2025 年期间,发射卫星,进一步扩展苹果 iPhone 系列的 SOS 卫星服务。
据报道,马斯克旗下社交平台𝕏(推特)日前调整了隐私政策,允许 𝕏 使用用户发布的信息来训练其人工智能(AI)模型。新的隐私政策将于 9 月 29 日生效。新政策规定,𝕏可能会使用所收集到的平台信息和公开可用的信息,来帮助训练 𝕏 的机器学习或人工智能模型。
9月2日,荣耀CEO赵明在采访中谈及华为手机回归时表示,替老同事们高兴,觉得手机行业,由于华为的回归,让竞争充满了更多的可能性和更多的魅力,对行业来说也是件好事。
《自然》30日发表的一篇论文报道了一个名为Swift的人工智能(AI)系统,该系统驾驶无人机的能力可在真实世界中一对一冠军赛里战胜人类对手。
近日,非营利组织纽约真菌学会(NYMS)发出警告,表示亚马逊为代表的电商平台上,充斥着各种AI生成的蘑菇觅食科普书籍,其中存在诸多错误。
社交媒体平台𝕏(原推特)新隐私政策提到:“在您同意的情况下,我们可能出于安全、安保和身份识别目的收集和使用您的生物识别信息。”
2023年德国柏林消费电子展上,各大企业都带来了最新的理念和产品,而高端化、本土化的中国产品正在不断吸引欧洲等国际市场的目光。
罗永浩日前在直播中吐槽苹果即将推出的 iPhone 新品,具体内容为:“以我对我‘子公司’的了解,我认为 iPhone 15 跟 iPhone 14 不会有什么区别的,除了序(列)号变了,这个‘不要脸’的东西,这个‘臭厨子’。