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