總結一些 Django 開發經驗

大三的時候第一次接觸 Django,從真正使用 Django 做項目到現在也快 4 年了。最喜歡的其實還是 Django 的 ORM 框架。公司的項目都是前後分離的,使用 Django 做後端介面開發還是很高效的。

特此總結一些 Django 開發的小經驗。先說一些最最基礎的吧。

  • 使用 virtualenv 隔離開發環境
  • 使用 pip 管理項目依賴,主要就是一個小技巧,使用 pip freeze > requirements.txt 來保存依賴的模塊和版本
  • 使用 gitignore.io 這個網站提供的 .gitignore 文件管理代碼庫文件

打包和發布

項目的打包和發布用的 Docker,Django 項目的 Dockerfile 特別簡單:

FROM python:3.5COPY ./requirements.txt /srcWORKDIR /srcRUN pip install -r requirements.txtCOPY . /srcEXPOSE <PORT>CMD uwsgi --http :<PORT> --wsgi-file <path/to/wsgi.py>

這一個 Dockerfile 模板可以通吃 80% 的 Django 項目了。

日誌配置

既然用 Docker,就放棄了把日誌寫入文件,直接寫到標準輸出。

# settings.py # ...LOGGING = { version: 1, disable_existing_loggers: False, formatters: { verbose: { format: [application] %(levelname)s %(asctime)s %(module)s %(message)s } }, handlers: { console: { level: DEBUG, class: logging.StreamHandler, stream: sys.stdout, formatter: verbose }, }, loggers: { app: { handlers: [console], level: DEBUG, propagate: True, }, },}

新版本的 uwsgi 已經可以把 webapp 的日誌收集起來輸出到標準輸出裡面了。如果需要收集、管理日誌的話,就是用 Docker 日誌收集工具,直接收集 Docker 容器的日誌即可。我們內部項目現在用的是 papertrailapp.com

自動化測試

既然是純後端項目,工程師完全可以通過自動化測試來檢測自己的代碼。Django 本身對測試提供了很好的支持,可以通過 sqlite 來搭建測試資料庫,還有基於內存的緩存,做測試不會增加對其他系統的依賴。開發起來事半功倍。

除了要寫自動化測試代碼,還要能統計測試覆蓋率。目前我們用的是 coverage.py 這個工具,說實話沒有 node.js 的 istanbul 好用,輸出的報告沒有 Istanbul 詳細和易讀。不過用來檢查 「死代碼」 還是夠用的。

針對 http 代碼的測試

有些項目需要對接的第三方系統比較多,比如微信認證、支付、簡訊等常見的,可能還有其他一些垂直業務領域的系統。這部分介面對接的代碼,也應該納入到測試當中,畢竟 Python 作為腳本語言,代碼很容易出現錯誤。

這塊一般是用 responses 這個模塊來 mock http 請求。

定時任務

有一些 Django 項目需要做一些定時任務。首先,絕對不用 linux 內置的 crontab。主要的問題還是維護的成本高,沒準哪天就把這個配置給忘了。

我們現在方式都是藉助 Django Command 的功能,將定時任務封裝成一個 command。在這個 command 裡面運行一個 scheduler。就像下面這樣:

import schedulefrom django.core.management.base import BaseCommandclass Command(BaseCommand): def handle(self, *args, **kwargs): schedule.every(45).minutes.do(do_this) schedule.every().day.at(04:00).do(do_that) while True: schedule.run_pending() time.sleep(1)

推薦閱讀:

代碼人生1002
《人月神話》讀書筆記④:解決問題
The world at your fingertips - 天涯明月刀幕後8(重啟)
【推薦】真正綠色的四窗口的文件管理器文件管理的福音

TAG:Python | 編程 | 軟體工程 |