本專案說明(正體中文版)

授權條款

為 new BSD 授權( 3-clause )。

目的

把創建一個軟體專案所需要的常用檔案及結構定義好,方便取用。主要是給 django-based 系統使用,同時可套用在「自架機器」或「GAE hosting」的「應用專案」上。

Note

名詞定義

  1. 「本專案」指的是 ho600-django-gae-default-trunk 專案
  2. 「應用專案」指的是您把 ho600-django-gae-default-trunk 所有檔案複製成新開發專案的那個專案

本專案的檔案架構配置如下:

ho600-django-gae-default-trunk/
                                asset/
                                bin/
                                conf_example/
                                docs/
                                docs-of-ho600-django-gae-default-trunk/
                                ho600_lib/
                                H6_lib/
                                trunk/
                                        depends_modules/
                                        modules/
                                        settings.py
                                        trunk_local_settings.py
                                        wsgi.py

asset/

放置第三方的函式庫, ./depends_modules.conf 則紀錄應該要抓取那些專案到 asset/ 中。內容如下:

1
2
3
# ./depends_modules.conf
asset/django-mediagenerator:tip = ssh://hg@bitbucket.org/wkornewald/django-mediagenerator
asset/django-tastypie:XXXYYYZZZ = git://github.com/toastdriven/django-tastypie.git

若有其他想要加入的模組,可自行加在 depends_modules.conf 中XXXYYYZZZ 代表特定版本的 changeset 碼,若無設定代表 tip ,有設定 XXXYYYZZZ 後,則該模組就只會 update 至該版本。但 pull 時還是會抓到 tip 版。

Note

目前僅支援 mercurial 儲存庫。若是使用 GitHub 專案請參考 hg-git

預設載入 django-mediagenerator, django-tastypie, django-guardian, django-debug-toolbar 等四個 django-based 模組,另外載入 jstree, jQuery-URL-Parser 等二個 js 函式庫。

bin/

執行命令有:

prepare_programming.py

每次在撰寫自己的應用專案前,所執行的指令。幫你把 depends_modules.conf 中所指定的專案程式更新到指定版本。並提醒你還有那些 hg repo 尚未 commit 。

更新完所需的 moduels 後,也同時把 trunk/depends_modules/ 中的 modules (有登記在 settings.INSTALLED_APPS 及 settings.ANOTHER_DEPENDS_MODULES ) 刪除,以確保在開發程式時,所載入的 module 一定是 settings.py 中有指定特別版本、特別位置的 module 。

又如果專案程式並不是使用 hg 或 git 控管,而是單用 .zip 儲存。則也用使用 [downloads] 作設定。

下載後的專案及檔案,可再利用 [copies] 設定將部份資料文件複製到其他位置中。

[downloads]
asset/Project = https://yoursite.com/yourfile.zip

[copies]
trunk/modules/p1/file.txt = asset/Project/file/example.conf

[deletes]
None = asset/ho600-django-gae-federated-auth/ho600_lib

上面的範例是將 https://yoursite.com/yourfile.zip 下載下來,解壓縮到 asset/Project 資料夾。並把 asset/Project/file/example.conf 檔案複製到 trunk/modules/p1/file.txt 中。

另外可把 asset/ho600-django-gae-federated-auth/ho600_lib 刪除,避免與 ROOT/ho600_lib 混肴。

before_deployment.py

要上傳至 production server 前所執行的指令,也是未來 jenkins 執行的指令。

這裡的行為主要是把 settings.INSTALLED_APPS 及 settings.ANOTHER_DEPENDS_MODULES 有登記的 modules (扣除 django 自己帶入的),複製一份到 trunk/depends_modules/ 。這樣在 deployment 時,只需把 trunk/ 整包上傳即可。

symbol_to_unicode.py

django dumpdata 的內容,在非 ASCII 編碼下,它會顯示 \u65b0 ,而非「新」這個字。執行如下指令:

$ bin/symbol_to_unicode.py old.json > new.json

則 new.json 內容會是一般人看得懂的文字,而不是 \uXXXX 。

monitor_file_and_make_html.sh

觀察特定資料夾內文件是否有修改,若有修改則立即執行 make html 指令( sphinx ),執行方式如下:

$ bin/monitor_file_and_make_html.sh docs-of-ho600-django-gae-default-trunk

執行後,它會持續等待,當 docs-of-ho600-django-gae-default-trunk/ 內有文件被更新,則在該資料夾自動編譯 document 。

Note

本程式只能在 Unix-like 系統中執行。

jenkins.sh

若使用 jenkins 作發佈,本 script 乃提供 jenkins 執行。

Note

本程式只能在 Unix-like 系統中執行。

reset_test_data_db

若使用的是 PostgreSQL 資料庫,可使用本 script 快速刪除資料表,並重建測試資料。

Note

本程式只能在 Unix-like 系統中執行。

conf_example/

放置 Apache+wsgi 及 Nginx+uWSGI 的設定範例檔。建議使用時,是將所需 apache2.conf 或 nginx.conf 檔案複製到 trunk/ 中,並在系統的 apache.conf 內使用:

1
2
# YOUR_SYSTEM_APACHE/httpd.conf
Include "WHERE_YOU_PUT_CONF_DIR/apache2.conf"

或是在系統的 nginx.conf 內使用:

1
2
# YOUR_SYSTEM_NGINX/nginx.conf
Include "WHERE_YOU_PUT_CONF_DIR/nginx.conf"

其中因為 nginx 是結合 uWSGI 一起使用的,所以需另外設定 uwsgi 設定檔:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
## /etc/uwsgi/apps-enabled/www.ini
## sudo invoke-rc.d uwsgi start
## sudo invoke-rc.d uwsgi stop
## sudo invoke-rc.d uwsgi restart
##
[uwsgi]
socket = /var/run/uwsgi/app/www/socket
chmod-socket = 666
limit-as = 256
processes = 6
max-request = 2000
memory-report = true
enable-threads = true
pythonpath = /YOUR_PROJECT_DIR/
chdir = /YOUR_PROJECT_DIR/
wsgi-file = /YOUR_PROJECT_DIR/wsgi.py

docs/

為 sphinx-based 的文件資料夾。給「應用專案」使用的預設文件寫作位置,當然也可以全刪除不使用或是自行再利用 sphinx-quickstart 生成一個。

docs-of-ho600-django-gae-default-trunk/

本專案的文件所在處。

ho600_lib/

方便作 django-based 程式開發的函式庫,主要有 bugrecord 功能,在執行程式時,若發生 500 錯誤時,能紀錄在資料庫內。

設定方式如下,只要把 ho600_lib.middleware.Handle500Middleware 加入 MIDDLEWARE_CLASSES 中,這樣在 DEBUG = False 或是 ajax request 發生 500 錯誤時,都會紀錄到資料庫中,預設瀏覽 bugpage 的連結是 http://localhost:XXXX/ho600_lib/buglist/

1
2
3
4
5
6
7
#settings.py

MIDDLEWARE_CLASSES = (
    ...
    'ho600_lib.middleware.Handle500Middleware',
)
INTERNAL_IPS = ('127.0.0.1', '1.2.3.4', )

另外則是要把開發者自己的 IP 登錄到 INTERNAL_IPS 變數中,才可以看到 bug page 。

Template Tags

在樣版中可使用 {% use_jqueryui “jquery_version” “jqueryui_version” “theme_name” %} 來載入 jQuery 相關檔案。此法所載入的 jQuery 會以 Google host 為基準作載入。

樣版選擇順序: get_template_by_site_and_lang

Todo

@hoamon: 先直接看程式碼

樣版中 static/media 檔案的 url 找尋

Todo

@hoamon: 先直接看程式碼

得知使用者以什麼網域名稱瀏覽: get_site_from_settings

Todo

@hoamon: 先直接看程式碼

PostCode Model

郵遞區號的資料表,目前已放置臺灣 3 碼郵遞區號資料( ho600_lib/fixtures/taiwan_postcode.json ),資料來源版本為 http://download.post.gov.tw/post/download/臺灣地區郵遞區號前3碼一覽表_9912.xls (2011/8/15 version) 。

使用方式是在你自己所寫 moduels 的 models.py 建立另一個 model ,如:

# filename: mymodules/models.py
from ho600_lib.models impor PostCode as PC
class PostCode(PC):
    pass

這樣在 syncdb 後,資料庫會產生一個 mymodules_postcode 資料表。若是需要使用 taiwan_postcode.json 資料,則先把 ho600_lib/fixtures/taiwan_postcode.json 複製到 mymodules/fixtures/my_taiwan_postcode.json ,一定要更名,要不然系統上會同時有兩個 taiwan_postcode.json。

my_taiwan_postcode.json 中的 model: “ho600_lib.postcode” 須修改為 model: “mymodules.postcode”,再來執行 ./manage.py loadddata my_taiwan_postcode.json ,就可把臺灣 3 碼郵遞區號資料匯入 mymodules_postcode 資料表。

其中,要注意的是 PostCode.id 並不是用連續自然數為值,而是要自定的且必須為 unique 。如: “臺灣” 的 id 為 “tw000”、”臺北市” 為 “tw001” ,而 “臺中市南區” 為 “tw402“ 。但因為 ”新竹市“ 、 “嘉義市” 全市只有 1 個郵遞區號,前者為 300 ,後者為 600 ,所以 “新竹市北區“ 的 id 為 “tw300-北區” , “嘉義市東區” 的 id 為 “tw600-東區” 。也就是把 parent.id + self.name 作為 self.id 。

id 不為連續自然數的好處,在於系統資料要作統整時,不同來源的 PostCode 其 id 勢必為相同。

H6_lib/

為商業套件,並不是以 new BSD 授權發佈。

trunk/

這裡是執行 ./manage.py runserver 0.0.0.0:8080 的地方,若要執行 GAE-based 的應用專案,則到上層目錄執行 dev_appserver.py . -a 0.0.0.0 -p 8080 。

trunk/depends_modules/

在使用 jenkins 發佈應用專案時,利用 bin/before_deployment.py 可將 settings.INSTALLED_APPS 中所需的 modules (扣除 django 自己的)全複製到 trunk/depends_modules/ 下。這樣 jenkins 發佈時,就只需要把 trunk/ 上傳至伺服器。目標伺服器就不需要預先安裝特定 pure-python 函式庫,但還是要裝 django 函式庫以及其他需事先編譯的函式庫如: PIL 、 numpy 、 scipy …等。

trunk/modules/

配置應用專案所開發的 modules 位置。不過如果「應用專案」本身並不是一個獨立網站,而是以 module 的形式存在者,建議是把 module 配置與 ho600_lib 同一層級,也就是根目錄的位置。

trunk/settings.py

Django 程式預設的設定檔檔名。另也可在 INSTALLED_APPS 配置 settings.py 檔,如: ho600_lib/settings.py 。ho600_lib/settings.py 中的變數載入可覆寫 trunk/settings.py 中的變數,惟有多個 INSTALLED_APPS 時,並無法保證它們的覆寫順序(此點請注意)。

但在 settings.py 中,目前 只有 MEDIA_BUNDLES 變數是採 append 行為 而不是覆寫,此變數供 django-mediagenerator 使用。

trunk/trunk_local_settings.py

不被 hg 控管的本地設定檔,本檔案所設定的參數會覆蓋 trunk/settings.py 的設定,但設定時,有一限制: 在 trunk_local_settings 的參數名稱必須預先存在 trunk/settings.py 或 INSTALLED_APPS/settings.py 中,這是確保開發者在本地自行開發後,也必須記得把該參數登記到 trunk/settings.py 、 INSTALLED_APPS/settings.py 中,以利其他開發者更正自己的 trunk/settings.py 。

且 trunk_local_settings.py 的載入順序為最後一個,確保它會覆寫所有 settings.py 所設定過的變數值。

wsgi.py

執行在 uwsgi 模式或 Apache WSGI 模式下時,所須要的檔案。

在 uwsgi 模式下運作時,有提供一 autoreload 的功能,也就是程式碼有變數,可從 django 提供的判別函式得知,並能觸發 uwsgi 自動重啟。

實際應用範例

https://bitbucket.org/hoamon/ho600-django-gae-default-trunk/downloads 這裡點選 Tags 頁面,下載所需的 ho600-django-gae-default-trunk 版本。也可以是用 hg clone ssh://hg@bitbucket.org/hoamon/ho600-django-gae-default-trunk 指令再配合 hg update -C ‘release-1.X.X’ 來使用。

得到 ho600-django-gae-default-trunk 資料夾後,先把它改名成自己的應用專案,像是: my-example ,並刪除 .hg 資料夾及 .hgtags 檔案,這是 ho600-django-gae-default-trunk 版本控制庫所使用的檔案,如是從 bitbucket downloads 頁面下載的,則無此資料夾。

修改 ./depends_modules.conf 。而後執行:

hoamon@localhost my-example # bin/prepare_programming.py

修改 trunk/settings.py 。而後執行:

hoamon@localhost my-example/trunk # ./manage.py runserver 0.0.0.0:8080

然後你可以在瀏覽器中看到:

_images/hello.png

接下來修改 trunk/urls.py (先把 urls.ho600_default_view 移除),刪除 trunk/__docs__ 、 ./docs-of-ho600-django-gae-default-trunk/ 。

如果你的應用專案是 gae-based 的,那請再修改 ./app.yaml 檔案。且利用下列指令在本地端開發。

hoamon@localhost my-example # dev_appserver.py . -a 0.0.0.0 -p 8080

現在你可以在 trunk/moduels/ 加入自己的模組了。恭喜你!