英文原文: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. Unity3D - 详解Quaternion类(二)

    OK,不做引子了,接上篇Unity3D - 详解Quaternion类(一)走起! 四.Quaternion类静态方法 Quaternion中的静态方法有9个即:Angle方法.Dot方法.Euler ...

  2. 二分求幂,快速求解a的b次幂

    一个引子 如何求得a的b次幂呢,那还不简单,一个for循环就可以实现! void main(void) { int a, b; ; cin >> a >> b; ; i < ...

  3. react新手入门(序)

    之前在软件园使用的是react,当时为了做个集光推送,自己去搭过react,这次项目中继续使用react,于是又重新操作了遍,恰巧公司买了本react的书籍,这本书写的非常好,看着并不觉得拗口,很容易 ...

  4. 中文路径-接口路径url不能传输中文解决方案

    服务端:

  5. App 应用通过网页打开 App Store

    NSURL *url = nil; if ([[[UIDevice currentDevice] systemVersion] intValue] >= 7.0) { //iOS7 使用旧的网址 ...

  6. ubis文件系统的制作

    在linux-2.6.27以前,谈到Flash文件系统,大家很多时候多会想到cramfs.jffs2.yaffs2等文件系统.它们也都是基于文件系统+mtd+flash设备的架构.linux-2.6. ...

  7. 在WCF中实现双工通信

    双工(Duplex)模式的消息交换方式体现在消息交换过程中,参与的双方均可以向对方发送消息.基于双工MEP消息交换可以看成是多个基本模式下(比如请求-回复模式和单项模式)消息交换的组合.双工MEP又具 ...

  8. 服务端用例设计的思(tao)路!

    服务端的测试简单来说就是除了前端以外的的测试. 总的来说可以分为以下两类: 1.     WEB或者APP的提供业务逻辑的服务端接口测试 2.     数据库.缓存系统.中间件..jar包依赖.输入输 ...

  9. PHP-001

    ThinkPHP单字母函数(快捷方法)使用总结 http://www.cnblogs.com/caicaizi/p/5173093.html

  10. M0 M4之UART初始化

    新唐的M0/M4 UART都有16级或者64级FIFO,用来缓存UART数据的收/发.例如:如果RX FIFO中断触发级别设为14,UART接收14个字节才会发生RDA(接收数据可得)中断.这样可以降 ...