我希望知道的关于Django的11件事(转)
英文原文:https://medium.com/cs-math/f29f6080c131
译文:http://my.oschina.net/chenlei123/blog/270672
两年前, 我开了家公司SocialQ。在开这家公司之前, 我几乎对开发一无所知。 我从头学习了HTTP, javascript, AJAX, 以及 Django 的MVC。 这是一个疯狂的旅程, 我们的知识栈 从成熟的技术到一些有趣的技术, 比如 D3.js, Backbone.js, Celery,Mongo, Redis, 以及其他的一些, 但这些不是一朝一夕的事情, 看看每天数千行的Django 代码, 我想把我本来可以做却没有做的事情点出来是必要的(I thought it would be worth pointing out things I wish I did differently。 按我自己从全文的理解意译的 译者注):
1. 从正确的目录结构开始:
开始, 我看了一些开源的工程作为指导, 读了一些博客, 但是想不到一个好的方式组织Django工程。下面是我目前使用的结构:

apps目录用于存放一些自定义的Django apps, vendor目录用于存放一些你不想通过pip 或者easy_install安装的apps。bin目录存放所有bash脚本,用于自动化部署。我在这里边有一些脚本用于部署到stage produection 服务器, 清理目录, 压缩资料(asserts), 备份数据库, 启动/停止 celery(本地)等等。config目录存放所有的包括数据库、web服务、munin、celery、supervisor等的配置文件。 media目录存放所有的静态文件,包括javascript,css,images,fonts等。 templates 存放所有是你的网站美观的html模板。最后, static目录存放所有压缩过的用于生产环境的文件(asserts)。我甚至在github上面建了一个模板,去试试吧!
2. 使用celery完成异步任务以及定时工作(不用unix 的crontab):
在开始的两周, 你也许并不需要把什么东西推送到异步进程中, 但是当你的不懂技术的合伙人开始抱怨为啥网站hang住了, 那就是时候开始召唤celery了(也有很多其他的方案,如果你需要更轻量级的话)。 任何不需要同步的调用都可以放到队列中然后被 workers 完成。我推荐使用redis作为celery的后端(backend) 不要浪费时间使用rabbitMQ,除非你有更好的理由。我使用celery去干各种任务,从发送邮件到从facebook api拉取数据。 另一个使用celery有趣的地方是, 你可以设置定时任务,用作cronjob。当我刚开始SocialQ的时候,是用unix的cronjob, 现在全部移到celery上面。
3.使用Gunicorn替代apache 作为你的web服务器:
据我所知, apache是久经沙场的(battle-tested)并且,两年前,当我还啥都不知道的时候, 它看起来是如此的难以按章配置。我只是想让我的网站运行起来然后忘掉代码里面的任何打印语句(译者注:用于调试用的吧:))-whoops(译者注:感 叹)-它把我的网站弄挂500多次。apache有一个非常庞大的配置,需要消耗大量的时间来弄懂。 Gunicorn特别简单好配置。大型的网站也用它, 因此如果你想创建下一个Instagram, 你的网站不会让你失望的(自从有了gunicorn, 妈妈再也不用担心我的网站挂掉啦, 哦ye :)译者注)。
更新:这个是假设你使用了Nginx作为网站的反响代理以及静态文件服务器。
4. 不要害怕使用mongodb作为你的主存储:
每当谈到Mongdb的时候,总有一些碎言碎语(Hate floating)出现在Hack 新闻中。我并不是干坐着,然后装作这其实是所有网站的问题。 但是我要说的是,它(Mongodb)非常适用于快速迭代。South在关系型数据库(RMDBS)的迁移中做的很好, 但是迁移在Mongodb中看起来更容易(看$set和$unset).两年前, 事情可能并不是这样--mongodb并没有现在这样成熟, 但是自那时起10gen(10gen是一家海量数据处理创业公司,Mongodb的开发公司 译者注)添加了高聚合(aggregation)框架,全文检索, collection级别的锁等。很高兴我已经开始使用了mongodb, 并且它会一直作为我的主要数据库。MongoEngine与Django工作的很好,如果你需要更多的控制, 可以使用pymongo作为补充。 也有许多大型公司喜欢mongodb。
5. 使用命名的URLs,Url转换以及Url模板标签:
这听起来似乎很没必要,但是, 其实,我是多么想在刚开始的时候(指作者刚开始创业的时候 译者注), 就知道URL转换。帮自己一把, 命名所有的url,并且在后端模板标签和转换的时候仅仅使用名字。 这样会在未来潜在得节省你不少时间, 因为没有任何东西是硬编码的,一个url变化不会影响这个网站和单元测试。
6. 好好使用你的settings.py文件:
有很多文章套困如何更好的组织django的settings。你可在这里和这里, 就我个人, 我喜欢在项目的顶级目录中添加,local_settings.py, 然后在settings.py的末尾导入这个配置,覆盖任何在settings上边生命的变量。对我来说这样已经很好了, 但是你无疑得区分好development, stage和production环境的settings。
7. 使用supervisor管理进程:
如果你还没有开始使用supervisor, 并且你想把应用部署在类unix的服务器上面, 从这里开始吧。supervisor会为你控制所有的进程。你仅仅需要为这些进程添加不同的配置。如果进程挂了,supervisor会把它拉起。
8. 使用适当的AJAX/JSON 机制
除非你想每次请求都重载整个页面,你应该使用AJAX来发送数据到服务器。但是首先你会遇到一个问题, django没有内建的json Http response(据我所知HttpResponse 不就ok?django已经在1.7版本中添加了JSONResponse 译者注), 因此你可能要自己来, 或者从其他比你厉害的人那儿考过来。 这儿有一个装饰器可以完美工作.
9. 使用redis, 因为它将会成为你最好的朋友:
如我在上面的建议, 在开始的时候, redis作为celery的队列, 在随后, 可以把django的session数据存放到redis。在然后你可以把redis作为缓存, 使用redis作为自动完成(auto-complete)。再然后,我自己轻松多了,赶快使用!
10. 用munin和statds监控进程:
munin让你可以作出任何状态的漂亮的曲线图, statds让你可以对任何东西计时或者计数。把这些尽快加入到你的项目中吧,然后监控任何东西。 你可以很容的用python写出munin的插件来监控任何任何东西。
11.使用jammit 作为静态文件压缩:
Jammit 来自于documentcloud, 甚至尽管它来自于ROR, 你仍然可以在django中使用它,其中一个让我喜欢的是, 你可以为你网站的不同段落的javascript和css文件设置不同的配置。它也支持其他的特性。
两年过去了, 两年的成长,增长了许多客户, 也遇到了很多麻烦, 这就是我想向大家分享的我本来可以做的更好的。 如果对这类内容感兴趣, 请关注我吧 @josephmisiti.
原文链接 https://medium.com/cs-math/f29f6080c131
我希望知道的关于Django的11件事(转)的更多相关文章
- 对于JavaScript的函数.NET开发人员应该知道的11件事
(此文章同时发表在本人微信公众号"dotNET每日精华文章",欢迎右边二维码来关注.) 昨天小感冒今天重感冒,也不能长篇大论.如果你是.NET开发人员,在进入前端开发领域的时候,对 ...
- 你需要了解 Windows Phone 8.1 的11件事
微软已经发布了其新一代手机操作系统 Windows Phone 8.1,拥有一些新的特性.从本质上来说,微软此次的大修让 Windows Phone 更接近 Android 和 iOS,对于使用体验的 ...
- 关于DevOps你必须知道的11件事
转自:http://www.infoq.com/cn/articles/11devops 关于作者 Gene Kim在多个角色上屡获殊荣:CTO.研究者和作家.他曾是Tripwire的创始人并担任了1 ...
- xadmin在Django 1.11中的使用及中英文切换
版权声明:本文为博主原创文章,欢迎转载,并请注明出处.联系方式:460356155@qq.com xadmin是一个强大的替代django admin的管理后台,github地址为:https://g ...
- angular 4 和django 1.11.1 前后端交互 总结
首先 angular4 和django 1.11.1交互 有跨域问题 所以先关闭cors 和csrf验证 一.解决跨域问题 cors github django-cors-headers 1)安装co ...
- django第11天(分页器)
django第11天分页器 分页模块 批量插入数据 book_list = [] #先生成对象 for i in range(100): book = Book(name = 'book%s'%i,p ...
- Ubuntu 16.04 安装 Django==1.11.8
vim InStall-Django.sh #!/bin/bash rm -rf /usr/bin/python ln -s /usr/bin/python3 /usr/bin/python mkd ...
- Django框架11 /form组件、modelForm组件
Django框架11 /form组件.modelForm组件 目录 Django框架11 /form组件.modelForm组件 1. form组件介绍 2. form常用字段与插件 3. form所 ...
- django 1.11.16之环境搭建
django版本:django1.11.16 windows环境 python 3.6.3 !!!可先安装虚拟环境在进行环境搭建 1.安装django:pip install django= ...
随机推荐
- asp.net截屏功能实现截取web页面
using System.Drawing; //打开该页面 System.Diagnostics.Process.Start("IEXPLORE.EXE", "http ...
- R-CNN目标检测的selective search(SS算法)
候选框确定算法 对于候选框的位置确定问题,简单粗暴的方法就是穷举或者说滑动窗口法,但是这必然是不科学的,因为时间和计算成本太高,直观的优化就是假设同一种物体其在图像邻域内有比较近似的特征(例如颜色.纹 ...
- cesium入门1
本教程将获得所有技能水平的开发人员和他们的第一个铯应用程序运行. 验证Cesium在您的Web浏览器中工作的最简单的方法是单击此处运行Hello World示例 (打开一个新窗口).如果你看到像下面的 ...
- 关于NoSQL与SQL的区别
简单说来:sql是关系型数据库的结构化查询语言,而nosql,一般代指菲关系型数据库,sql语句就不能用来,不过有些有leisql的查询语言,且nosql数据库没有统一的查询语言. 相关参考文章阅读: ...
- 如何根据select选择的值反查option的属性
有时候select已经被选中了,想知道这个选中option的属性又该如何处理呢? 我这里提供一种粗暴的方式 <!DOCTYPE HTML> <html lang="en-U ...
- org.apache.ibatis.builder.IncompleteElementException: Could not find parameter map com.hyzn.historicalRecord.dao.ITB_HISTORYLOGDAO.TB_HISTORYLOGResultMap
用了很久的myBatis,忽然出现这个错误,感觉配置什么的都是正确的,错误如下: org.apache.ibatis.builder.IncompleteElementException: Could ...
- Python做简单爬虫(urllib.request怎么抓取https以及伪装浏览器访问的方法)
一:抓取简单的页面: 用Python来做爬虫抓取网站这个功能很强大,今天试着抓取了一下百度的首页,很成功,来看一下步骤吧 首先需要准备工具: 1.python:自己比较喜欢用新的东西,所以用的是Pyt ...
- C++异常 调用abort()
以一个计算两个数的调和平均数的函数为例.两个数的调和平均数的定义是:这两个数倒数的平均值的倒数,因此表达式为:1.0 * x * y / (x + y)如果y是x的负值,则上述公式将导致被零除——一种 ...
- poj_1236 强连通分支
题目大意 有N个学校,这些学校之间用一些单向边连接,若学校A连接到学校B(B不一定连接到A),那么给学校A发一套软件,则学校B也可以获得.现给出学校之间的连接关系,求出至少给几个学校分发软件,才能使得 ...
- tomcat源码---->request的请求参数分析
当contentType为application/json的时候,在servlet中通过request.getParameter得到的数据为空.今天我们就java的请求,分析一下request得到参数 ...