本章我們會學習到以下內容:
* 使用虛擬環境
* 創建一個項目文件結構
* 用pip處理項目依賴
* 在項目中包括外部的依賴
* 在settings中定義相對路徑
* 為Subersion用戶動態地配置STATIC_URL
* 為Git用戶動態地配置STATIC_URL
* 創建并包括本地設置
* 把UTF-8設置為MySQL配置的默認編碼格式
* 設置Subversion的忽略特性
* 創建Git的忽略文件
* 刪除Python編譯文件
* Python文件中的導入順序
* 定義可重寫的app設置
## 引言
## 為子版本用戶動態地設置STATIC_URL
如果你對`STATIC_URL`設置一個靜態值,那么每次你更新CSS文件,JavaScript文件,或者圖片都需要清除瀏覽器的緩存以應用改變。有一個
## 預熱
## 具體做法
## 實現原理
#### 參見
## 為Git用戶動態地設置STATIC_URL
## 預熱
確保你的項目處理Git版本控制器之下。
## 具體做法
## 實現原理
#### 參見
## 創建并包含本地設置
你不得不需要至少兩個不同的項目實例:一個是創建新特性的開發環境,另一個是托管服務器中的公開網站環境。此外,可能會有針對其他開發者的不同的開發環境。你或許也需要有一個過渡性的環境以在一個類公開網站這樣的情況下測試項目。
## 預熱
不同環境的大多數設置都會共享并保存在版本控制中。不過,這里仍人會有一些針對某些項目環境的特別設置,例如,數據庫或者電子郵件設置。我們把它們都放進`local_settings.py`文件中。
## 具體做法
執行以下步驟:
1. 在`local_settings.py`的尾部添加聲明在相同目錄下的`local_settings.py`的描述:
```python
#settings.py
# ... 把這些代碼放到文件的結尾 ...
try:
execfile(os.path.join(os.path.dirname(__file__), ';local_settings'))
except IOError:
pass
```
2. 創建`local_settings.py`然后把特定的環境設置加入到文件中:
```python
#local_settings.py
DATABASES = {
"default": {
"ENGINE": "django.db.backends.mysql",
"NAME": "myproject",
"USER": "root",
"PASSWORD": "root",
}
}
}
EMAIL_BACKEND = "django.core.mail.backends.console.EmailBackend"
INSTALLED_APPS += (
"debug_toolbar",
)
```
## 工作原理
如你所見,本地設置并沒有正常地導入,它們卻包含在`settings.py`中并被執行。這樣不僅允許你創建或者重寫存在的設置,而且也可以調整`settings.py`文件中元組或者列表;例如,這里我們添加`debug_toolbar`到`INSTALLED_APPS`以啟用對SQL查詢,模板上下文變量,等等的調試。
## 參見
The Creating a project file structure recipe
The Toggling Debug Toolbar recipe in Chapter 10, Bells and Whistles
## 配置UTF_8作為MySQL配置的默認編碼
## 預熱
## 具體做法
## 工作原理
## 設置Subversion的忽略特性
## 預熱
## 具體做法
打開命令行工具并社會默認編輯器為`nano,vi,vim`或者其他的任何你個人喜歡的編輯器:
```python
$ export EDIOR=nano
```
>##### 提示
如果你還沒有選擇自己喜歡的編輯器,我推薦使用nano
## 工作原理
## 參見
## 創建Git的忽略文件
## 預熱
## 具體做法
使用你最喜歡的文本編輯器,在Django項目的根目錄下創建一個`.gitinore`文件,然后把這些文件和目錄放進剛創建的文件中:
```python
#.gitinore
*.pyc
/myproject/local_settings.py
/myproject/static/
/myproject/tmp/
/myproject/media/
```
## 工作原理
## 參見
The Setting the Subversion ignore property recipe
## 刪除Python的編譯文件
## 預熱
## 具體做法
## 工作原理
## 參見
## Python文件中的導入順序
當你創建Python模塊時,保持文件內的結構一致是個好的做法。這樣做可以讓其他的開發者和你自己在閱讀代碼時相對輕松一些。這個方法會向你演示如何組織導入。
## 預熱
在Django項目中創建一個虛擬目錄。
## 具體做法
在你創建的Python文件中應用下面的結構。然后要做的就是,在第一行定義UTF-8作為默認的Python文件編碼,并把分類的導入放進文件區域:
```python
# -*- coding: UTF-8 -*-
# System libraries
import os
import re
from datetime import datetime
# Third-party libraries
import boto
from PIL import Image
# Django modules
from django.db import models
from django.conf import settings
# Django apps
from cms.models import Page
# Current-app modules
import app_settings
```
## 工作原理
如下,我們有五個主要的目錄被導入:
## 更多內容
## 參見
## 定義可重寫的app設置
該做法會向你演示如何給應用定義設置,它可以在之后于項目的`settings.py`或者`local_settings.py`文件中被重寫。對于可重復使用的應用該做法特別有效。
## 預熱
手動地創建Django應用,或者利用下面的這個命令:
```python
(myproject_env)$ django-admin.py startapp myapp1
```
## 具體做法
如果你剛好有一個到兩個設置,你可以在`models.py`中使用下面的模式。如果設置也很多,你剛好也想要更好的組織它們,那么你可以在應用中創建一個文件`app_settings.py`,然后以下列方式寫設置:
```python
#models.py or app_settings.py
# -*- coding: UTF-8 -*-
from django.conf import settings
from django.utils.translation import ugettext_lazy as _
SETTING1 = getattr(settings, "MYAPP1_SETTING1", u"default value")
MEANING_OF_LIFE = getattr(settings, "MYAPP1_MEANING_OF_LIFE", 42)
STATUS_CHOICES = getattr(settings, "MYAPP1_STATUS_CHOICES", (
('draft', _("Draft")),
('published', _("Published")),
('not_listed', _("Not Listed")),
))
```
然后,你可以在`models.py`中以下面的方法使用應用的設置:
```python
#models.py
# -*- coding: UTF-8 -*-
from django.db import models
from django.utils.translation import ugettext_lazy as _
from app_settings import STATUS_CHOICES
class NewsArticle(models.Model):
# ...
status = models.CharField(_("Status"),
max_length=20, choices=STATUS_CHOICES
)
```
如果你想要為一個項目重寫`STATUS_CHOICES`,你只需簡單地打開`settings.py`并加入下面代碼:
```python
#settings.py
# ...
from django.utils.translation import ugettext_lazy as _
MYAPP1_STATUS_CHOICES = (
("imported", _("Imported")),
("draft", _("Draft")),
("published", _("Published")),
("not_listed", _("Not Listed")),
("expired", _("Expired")),
)
```
## 工作原理
Python函數,`getattr(object, attribute_name[, default_value])`,視圖從`object`獲取屬性`attribute_name`,如果未找到屬性則返回`default_value`。這個例子中,不同的設置從Django項目設置模塊中被視圖取回,如果這些設置沒找到,則默認值被使用。