【翻译】在开公司之前, 我希望知道的关于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。 按我自己从全文的理解意译的  译者注):

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

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

【翻译】在开公司之前, 我希望知道的关于Django的11件事

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,python,APP,celery)