【翻译】在开公司以前, 我但愿知道的关于Django的11件事

     两年前, 我开了家公司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。 按我本身从全文的理解意译的  译者注):javascript

1. 从正确的目录结构开始: css

开始, 我看了一些开源的工程做为指导, 读了一些博客, 可是想不到一个好的方式组织Django工程。下面是我目前使用的结构:html

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上面建了一个模板,去试试吧!java

2. 使用celery完成异步任务以及定时工做(不用unix 的crontab):python

在开始的两周, 你也许并不须要把什么东西推送到异步进程中, 可是当你的不懂技术的合伙人开始抱怨为啥网站hang住了, 那就是时候开始召唤celery了(也有不少其余的方案,若是你须要更轻量级的话)。 任何不须要同步的调用均可以放到队列中而后被 workers 完成。我推荐使用redis做为celery的后端(backend) 不要浪费时间使用rabbitMQ,除非你有更好的理由。我使用celery去干各类任务,从发送邮件到从facebook api拉取数据。 另外一个使用celery有趣的地方是, 你能够设置定时任务,用做cronjob。当我刚开始SocialQ的时候,是用unix的cronjob, 如今所有移到celery上面。git

3.使用Gunicorn替代apache 做为你的web服务器:github

据我所知, apache是久经沙场的(battle-tested)而且,两年前,当我还啥都不知道的时候, 它看起来是如此的难以按章配置。我只是想让个人网站运行起来而后忘掉代码里面的任何打印语句(译者注:用于调试用的吧:))-whoops(译者注:感叹)-它把个人网站弄挂500屡次。apache有一个很是庞大的配置,须要消耗大量的时间来弄懂。 Gunicorn特别简单好配置。大型的网站也用它, 所以若是你想建立下一个Instagram, 你的网站不会让你失望的(自从有了gunicorn, 妈妈不再用担忧个人网站挂掉啦, 哦ye  :)译者注)。web

更新:这个是假设你使用了Nginx做为网站的反响代理以及静态文件服务器。redis

4. 不要惧怕使用mongodb做为你的主存储: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

相关文章
相关标签/搜索