英文原文: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件事(转)的更多相关文章

  1. 对于JavaScript的函数.NET开发人员应该知道的11件事

    (此文章同时发表在本人微信公众号"dotNET每日精华文章",欢迎右边二维码来关注.) 昨天小感冒今天重感冒,也不能长篇大论.如果你是.NET开发人员,在进入前端开发领域的时候,对 ...

  2. 你需要了解 Windows Phone 8.1 的11件事

    微软已经发布了其新一代手机操作系统 Windows Phone 8.1,拥有一些新的特性.从本质上来说,微软此次的大修让 Windows Phone 更接近 Android 和 iOS,对于使用体验的 ...

  3. 关于DevOps你必须知道的11件事

    转自:http://www.infoq.com/cn/articles/11devops 关于作者 Gene Kim在多个角色上屡获殊荣:CTO.研究者和作家.他曾是Tripwire的创始人并担任了1 ...

  4. xadmin在Django 1.11中的使用及中英文切换

    版权声明:本文为博主原创文章,欢迎转载,并请注明出处.联系方式:460356155@qq.com xadmin是一个强大的替代django admin的管理后台,github地址为:https://g ...

  5. angular 4 和django 1.11.1 前后端交互 总结

    首先 angular4 和django 1.11.1交互 有跨域问题 所以先关闭cors 和csrf验证 一.解决跨域问题 cors github django-cors-headers 1)安装co ...

  6. django第11天(分页器)

    django第11天分页器 分页模块 批量插入数据 book_list = [] #先生成对象 for i in range(100): book = Book(name = 'book%s'%i,p ...

  7. 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 ...

  8. Django框架11 /form组件、modelForm组件

    Django框架11 /form组件.modelForm组件 目录 Django框架11 /form组件.modelForm组件 1. form组件介绍 2. form常用字段与插件 3. form所 ...

  9. django 1.11.16之环境搭建

    django版本:django1.11.16  windows环境 python 3.6.3    !!!可先安装虚拟环境在进行环境搭建  1.安装django:pip install django= ...

随机推荐

  1. Powershell 的自己主动部署

     工作中反复性的版本号移植,一天上线10几次,让我痛不欲生,频繁的操作也可能出现疲劳性失误,导致严重的生产故障.于是乎,闲暇时间.我開始研究使用powershell自己主动部署程序到Linuxse ...

  2. struts2的零配置

    最近开始关注struts2的新特性,从这个版本开始,Struts开始使用convention-plugin代替codebehind-plugin来实现struts的零配置.配置文件精简了,的确是简便了 ...

  3. HTML之DocType的几种类型

    一.什么是DOCTYPE DOCTYPE是Document Type(文档类型)的简写,在页面中,用来指定页面所使用的XHTML(或者HTML)的版本.要想制作符合标准的页面,一个必不可少的关键组成部 ...

  4. ModelState.AddModelError使用

    后台: ModelState.AddModelError("userPwd", "请输入密码!"); ModelState是一个字典类型,这句话的作用是向Mod ...

  5. CentOS下yum安装PHP,配置php-fpm服务

    yum list installed | grep php 先删除已有的php版本 ,执行下面的命令删除php yum remove php-common 然后像安装那样问你是否继续的,输入yes即可 ...

  6. 理解ros话题--6

    理解ROS话题(原创博文,转载请标明出处--周学伟http://www.cnblogs.com/zxouxuewei/) Description: 本教程介绍ROS话题(topics)以及如何使用ro ...

  7. 关于JavaScript中的this

    1.关于this的误会. 误会(1):this指向所在函数本身. 我们常常会对this产生各种误会,比如说我们可能认为this会指向所在函数本身,但实际上并非如此. function foo (){ ...

  8. 在map中一个key中存多个值

    一说到map都想到key-value键值队存在.key可以为最多一个null的key. 今天开发中一个业务需求,在map中一个key中存多个对象. 我首先想到Map<String,List> ...

  9. 更改嵌入式Linux中开机画面----左上角小企鹅图标

    一直想给嵌入式仪表加个开机LOGO,但是没有找到更换的方法.最近在网上收集了一些文章,整理一下一共自己参考.目前也还没有试过这种方法究竟是否可以.但察看Kernel源代码可以知道,Linux-2.6的 ...

  10. UITouch 的主要方法:

    1. UITouch 的主要方法: - (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event; - (void)touchesM ...