================================================================================
本專案說明(正體中文版)
================================================================================
--------------------------------------------------------------------------------
授權條款
--------------------------------------------------------------------------------
為 new BSD 授權( 3-clause )。
--------------------------------------------------------------------------------
目的
--------------------------------------------------------------------------------
把創建一個軟體專案所需要的常用檔案及結構定義好,方便取用。\
主要是給 django-based 系統使用,\
同時可套用在「自架機器」或「GAE hosting」的「應用專案」上。
.. note:: 名詞定義
1. 「本專案」指的是 ho600-django-gae-default-trunk 專案
2. 「應用專案」指的是您把 ho600-django-gae-default-trunk 所有檔案複製成新開發專案的那個專案
本專案的檔案架構配置如下:
.. code-block:: bash
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/ 中。\
內容如下:
.. code-block:: python
:linenos:
# ./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] 設定將部份資料文件複製到其他位置中。
.. code-block:: conf
[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 ,而非「新」這個字。\
執行如下指令:
.. code-block:: bash
$ bin/symbol_to_unicode.py old.json > new.json
則 new.json 內容會是一般人看得懂的文字,而不是 \\uXXXX 。
monitor_file_and_make_html.sh
................................................................................
觀察特定資料夾內文件是否有修改,若有修改則立即執行 make html 指令( sphinx ),\
執行方式如下:
.. code-block:: bash
$ 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 內使用:
.. code-block:: apache
:linenos:
# YOUR_SYSTEM_APACHE/httpd.conf
Include "WHERE_YOU_PUT_CONF_DIR/apache2.conf"
或是在系統的 nginx.conf 內使用:
.. code-block:: nginx
:linenos:
# YOUR_SYSTEM_NGINX/nginx.conf
Include "WHERE_YOU_PUT_CONF_DIR/nginx.conf"
其中因為 nginx 是結合 uWSGI 一起使用的,所以需另外設定 uwsgi 設定檔:
.. code-block:: ini
:linenos:
## /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/ 。
.. code-block:: python
:linenos:
#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 ,如:
.. code-block:: python
# 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 。而後執行:
.. code-block:: bash
hoamon@localhost my-example # bin/prepare_programming.py
修改 trunk/settings.py 。而後執行:
.. code-block:: bash
hoamon@localhost my-example/trunk # ./manage.py runserver 0.0.0.0:8080
然後你可以在瀏覽器中看到:
.. figure:: _static/hello.png
接下來修改 trunk/urls.py (先把 urls.ho600_default_view 移除),\
刪除 trunk/__docs__ 、 ./docs-of-ho600-django-gae-default-trunk/ 。
如果你的應用專案是 gae-based 的,那請再修改 ./app.yaml 檔案。且利用下列指令在本地端開發。
.. code-block:: bash
hoamon@localhost my-example # dev_appserver.py . -a 0.0.0.0 -p 8080
現在你可以在 trunk/moduels/ 加入自己的模組了。恭喜你!