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