两年前, 我开了家公司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