英文原文:https://medium.com/cs-math/f29f6080c131javascript
譯文:http://my.oschina.net/chenlei123/blog/270672css
兩年前, 我開了家公司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。 按我本身從全文的理解意譯的 譯者注):html
1. 從正確的目錄結構開始: java
開始, 我看了一些開源的工程做爲指導, 讀了一些博客, 可是想不到一個好的方式組織Django工程。下面是我目前使用的結構:python
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上面建了一個模板,去試試吧!git
2. 使用celery完成異步任務以及定時工做(不用unix 的crontab):github
在開始的兩週, 你也許並不須要把什麼東西推送到異步進程中, 可是當你的不懂技術的合夥人開始抱怨爲啥網站hang住了, 那就是時候開始召喚celery了(也有不少其餘的方案,若是你須要更輕量級的話)。 任何不須要同步的調用均可以放到隊列中而後被 workers 完成。我推薦使用redis做爲celery的後端(backend) 不要浪費時間使用rabbitMQ,除非你有更好的理由。我使用celery去幹各類任務,從發送郵件到從facebook api拉取數據。 另外一個使用celery有趣的地方是, 你能夠設置定時任務,用做cronjob。當我剛開始SocialQ的時候,是用unix的cronjob, 如今所有移到celery上面。web
3.使用Gunicorn替代apache 做爲你的web服務器:redis
據我所知, apache是久經沙場的(battle-tested)而且,兩年前,當我還啥都不知道的時候, 它看起來是如此的難以按章配置。我只是想讓個人網站運行起來而後忘掉代碼裏面的任何打印語句(譯者注:用於調試用的吧:))-whoops(譯者注:感 嘆)-它把個人網站弄掛500屢次。apache有一個很是龐大的配置,須要消耗大量的時間來弄懂。 Gunicorn特別簡單好配置。大型的網站也用它, 所以若是你想建立下一個Instagram, 你的網站不會讓你失望的(自從有了gunicorn, 媽媽不再用擔憂個人網站掛掉啦, 哦ye :)譯者注)。mongodb
更新:這個是假設你使用了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