1. 程式人生 > 程式設計 >Django 專案佈局方法(值得推薦)

Django 專案佈局方法(值得推薦)

一、這種佈局的優點

  1. 專案中的每個應用都相對獨立,方便以後拿出來重用。
  2. 這樣的佈局會促使你在開發過程中考慮每個應用的重用性。
  3. 開發、測試、生產等不同的環境都有各自獨立的配置檔案,方便配置項的共享和定製。
  4. 不同的環境都有各自獨立的 pip requirements 檔案。
  5. 每個應用都有各自的 templates 和 static 目錄,你可以通過專案級的 templates 和 static 目錄中的檔案對各應用中的相應內容進行覆蓋。
  6. 對 models、views、managers 等的測試都各自儲存在獨立的檔案中,易於閱讀和理解。

二、Django 預設產生的佈局


假設專案名為 foo,使用 python django-admin.py startproject foo 命令產生的預設佈局會是:

foo/
  manage.py
  foo/
    __init__.py
    settings.py
    urls.py
    wsgi.py

三、推薦的專案佈局

假設我們的專案名為 myproject,其中有兩個應用 blog 和 users,推薦的專案佈局可以為:

myproject/
  manage.py
  myproject/
    __init__.py
    urls.py
    wsgi.py
    settings/
      __init__.py
      base.py
      dev.py
      prod.py
  blog/
    __init__.py
    models.py
    managers.py
    views.py
    urls.py
    templates/
      blog/
        base.html
        list.html
        detail.html
    static/
      css/
      js/
      …
    tests/
      __init__.py
      test_models.py
      test_managers.py
      test_views.py
  users/
    __init__.py
    models.py
    views.py
    urls.py
    templates/
      users/
        base.html
        list.html
        detail.html
    static/
      css/
      js/
      …
    tests/
      __init__.py
      test_models.py
      test_views.py
   static/
     css/
     js/
     …
   templates/
     base.html
     index.html
   requirements/
     base.txt
     dev.txt
     test.txt
     prod.txt

1. 每個應用的目錄位置

最頂層的 myproject 目錄包含有 manage.py 檔案,因此是專案的根目錄。 myproject/myproject/ 是專案的內容目錄,專案的根 URL 配置檔案,WSGI 配置檔案都存放在這裡面。

myproject/blog/ 和 myproject/users/ 是專案的兩個應用所在的目錄,將 blog、 users 這兩個應用的目錄與 myproject/myproject/ 平行放置,而不放置在 myproject/myproject/ 目錄內的好處是: 之後要 import 應用中的模組時,比如 import blog 應用中的 models 時,可以用 import blog.models,而不需要用 import myproject.blog.models,這樣也方便之後能將應用獨立出來重用。

2. 為每個環境設定各自的配置資訊

針對專案的各個環境,如本地開發 dev、 內部測試 stage、 自動化流程環境 jenkins 及生產環境 prod,分別建立獨立的配置檔案。

  1. 在 myproject/myproject 目錄下新建一個 settings 目錄並在裡面建立一個空的 __init__.py。
  2. 將 myproject/myproject/settings.py 檔案搬到 myproject/myproject/settings/ 目錄下,並改名為 base.py,這個檔案裡面的配置資訊被所有其它環境的配置檔案所共享。
  3. 在 myproject/myproject/settings/ 目錄下分別建立 dev.py、stage.py、jenkins.py 和 prod.py 4 個檔案,每個檔案中包含如下的一行程式碼:
from base import *

這樣,這些環境配置檔案就能讀取預設的配置項了,之後就能在各自的配置檔案中設定定製的配置值了。比如本地開發環境,可以在 dev.py 中新增 DEBUG=True**, 而生產環境 **prod.py**,可以設定 DEBUG=False`。

指定使用哪個配置檔案:

可以通過作業系統的環境變數指定,比如:

export DJANGO_SETTINGS_MODELS="myproject.settings.prod"

也可以通過命令列引數指定, 比如:

./manage.py migrate --settings=myproject.settings.prod

或者

gunicorn -w 4 -b 127.0.0.1:8001 --settings=myproject.settings.prod

3. 修改 INSTALLED_APPS

預設的 INSTALLED_APPS 會是:

INSTALLED_APPS = (
  ...
)

可以將元組 () 改為列表 []:

INSTALLED_APPS = [
  ...
]

進一步可以將 INSTALLED_APPS 中的第三方(內建)的應用與我們自己的應用分開,如:

PREREQ_APPS = [
  ‘django.contrib.auth',‘django.contrib.contenttypes',…
  ‘debug_toolbar',‘imagekit',‘haystack',]

PROJECT_APPS = [
  ‘homepage',‘users',‘blog',]

INSTALLED_APPS = PREREQ_APPS + PROJECT_APPS

這樣分開後,我們就可以只針對我們自己的應用進行 test 和 code coverage。

以上針對 INSTALLED_APPS 的修改也可以針對 TEMPLATE_DIRS 和 MIDDLEMARE_CLASSES 進行。

4. 調整 pip requirements

專案一般都有一個 requirements.txt 檔案,可以指定專案的依賴包,根據這個檔案,可以用以下命令對依賴包進行自動安裝:

pip install -r requirements.txt

在 requirements.txt 檔案中可以用 -r filename 來包含進另一個檔案的內容,這個功能和 C 語言中的 #include <filename.h> 類似。

因此,我們可以將通用的依賴資訊儲存在 myproject/requirements/base.txt 檔案中,而針對不同的環境,比如測試環境,儲存在另一個檔案中,如 myproject/requirements/test.txt,裡面的內容可能會是:

-r base.txt
pytest==2.5.2
coverage==3.7.1

5. 分割測試檔案

在每個應用中分別建立一個包含測試內容的目錄 tests,將對應不同類別的測試分別儲存在不同的檔案中,如 test_models.py、 test_views.py 等。這樣分配,比起將全部測試程式碼放在單個檔案中的好處是:程式碼更易閱讀,同時還能減少在編輯器中上下翻滾的時間。

6. URL 配置檔案

先各個應用內的 urls.py 儲存各自的 URL 配置,然後在專案的根 URL 配置檔案中,通過 include 命令將子應用的 URL 配置資訊包含進行:

urlpatterns = patterns(‘',url(r'^$',HomePageView.as_view(),name=‘home'),url(r'^blog/‘,include(‘blog.urls')),url(r'^user/‘,include(‘users.urls')),)

7. 模板和靜態檔案

各個子應用都應該有各自的模板和靜態檔案目錄,如 blog 的模板和靜態檔案目錄位置應該為: myproject/blog/templates/blog/ 和 myproject/blog/static/blog/ 。如果想對子應用中的模板和靜態檔案進行覆蓋,可以通過在專案根模板和根靜態檔案目錄中建立相同名字的檔案進行。比如要覆蓋 blog 中的 detail.html 模板,可以通過建立 myproject/templates/blog/detail.html 檔案來對預設的模板檔案進行覆蓋。

8. 重用子應用

如果想在另一個專案中重用 blog 應用,正確的方法是:

  1. 將 blog 應用提取出來,建立一個獨立的程式碼庫
  2. 在各個專案中,使用 pip install 的方式安裝 blog 應用
  3. 在各個專案中,使用 pip 對依賴的 blog 進行更新

參考文獻: http://www.revsys.com/blog/2014/nov/21/recommended-django-project-layout/

到此這篇關於Django 專案佈局方法(值得推薦)的文章就介紹到這了,更多相關Django 專案佈局方法(值得推薦)內容請搜尋我們以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援我們!