http://docs.djangoproject.com/en/dev/topics/db/multi-db/#topics-db-multi-db
Django 1.2 新功能: Multiple databases
PostgreSQL 9.0 新功能 Hot Standby跟Streaming Replication
http://wiki.postgresql.org/wiki/Streaming_Replication
http://developer.postgresql.org/pgdocs/postgres/hot-standby.html
還沒空試, 不過結合這幾個新功能的話似乎可以有效的分散django資料庫端的read/write, 將write-only database server上的WAL(write-ahead log) 即時streaming到read-only database server上的hot standby database, 感覺好像不錯~~

首先感謝 酷學園團隊、Who’s Who 工作坊、自由軟體鑄造場 舉辦的一系列南部的 python、Django 活動,今天的活動主題是:Web Framework- Django -初階 (講者:陳建玎),簡介了為什麼需要 MVC 架構寫法,MVC 的重要性,以及 Django 的優點,還蠻豐富的課程,其實重點都是在如何使用 MVC 加速開發 Web 網站,以及在 Team Work 裡的重要性,目前在開發 Web Framework 都是利用 PHP 一套 Frame Work:Codeigniter,在台灣已經有中文網站:CodeIgniter 繁體中文,自己接手了 CodeIgniter 計畫翻譯中文文件,還有開發 forum 中文討論區,還在規劃中,自己也才摸 CodeIgniter 一個多禮拜,底下有一張上課的投影片,介紹三種 Frame Work 的 Model、Views、Controller


上面兩張投影片把 Django MVC 的精華都講出來了,Model 在 Frame Work 裡面就是跟 database 互相溝通,View 部份就是設計基本的 html 架構,把簡單的 while、for 的語法寫到 Template 裡面。使用者 Browser 對伺服器要求 Request,Django 就會針對 url 呼叫 urls.py,urls.py 裡面就寫著相對應的結構,如下:
# Uncomment the next two lines to enable the admin:
from django.contrib import admin
admin.autodiscover()
urlpatterns = patterns('',
# Example:
# (r'^mysite/', include('mysite.foo.urls')),
# Uncomment the admin/doc line below and add 'django.contrib.admindocs'
# to INSTALLED_APPS to enable admin documentation:
# (r'^admin/doc/', include('django.contrib.admindocs.urls')),
# Uncomment the next line to enable the admin:
(r'^admin/(.*)', admin.site.root),
# (r'^admin/', include('django.contrib.admin.urls')),
(r'news/', 'mysite.hellowordapp.startpage'),
(r'^$', 'mysite.hellowordapp.startpage'),
)
urls.py 裡面會寫基本的 Regular Expression 對應到 project 檔案,基本的 Regular Expression 要會一點,不管是哪一套 MVC,都需要用到 Regular Expression,在 Codeigniter PHP Framework 架構裡面對應的是 application/config/routes.php 的 URI Routing,接下來就是 View(COntroller),最後就是 model 呼叫了,其實最主要就是達到程式與樣板的分離,以及 database 跟 controller 的分開,對於程式人員跟美工人員相互合作,這個方式是最好的。
底下來快速介紹如何實作出線上新聞發佈系統,上課老師是把環境建立在 Windows 底下,不過我發現底下很多學員都是 run 在 Linux 底下,而我自己是弄在 FreeBSD 系統上面,其實做法都差不多,ubuntu 用 apt-get 方式,Fedora 是用 yum,FreeBSD 是用 ports 的方式,不管熟悉哪一種都可以輕鬆上手,run 在 Windows 上面也蠻方便的,一切都是看個人習慣了。
首先 FreeBSD ports 安裝:
課程上的很充實,需要投影片或者是範例的,都可以到 Web Framework- Django -初階 (講者:陳建玎) 上面觀看或者是下載,另外也有 wiki,大家上課的筆記都可以寫在上面喔。
# 目前版本 py25-django-1.0.2
# maintainer lwhsu@FreeBSD.org
cd /usr/ports/www/py-django
# make showconfig
make install clean
FreeBSD 會依序幫您裝好相關套件,MySQL、SQLite3、POSTGRESQL、MOD_PYTHON3(Install Apache2 with mod_python3),這些是 ports 的 config 選單是可以自由選擇。
接下來介紹快速使用 Django 開發一個新聞系統,介紹如何使用 Django 強大後台,上課過程老師是教大家先建立 model 再使用 manager syncdb tool 建立 database 資料表,那我來寫反向教學,先建立資料表,在利用 inspectdb tool 產生 model 資訊,自己通常都是用 MySQL 先建立好該有的資料表,這樣會比較方便。
1. 建立專案
# 在任何目錄底下都可以使用這個指令
django-admin.py startproject mysite
底下會出現幾個檔案:settings.py、urls.py、manage.py,大概介紹一下這三個檔案的用途,settings.py 用來設定系統參數,如:連接資料庫類型,帳號,密碼,urls.py 用來處理網址列導向,需要基本正規語言知識,manage.py 管理整個 Django 專案工具,可以鍵入 python manage.py help 來查看如何使用。
2. 建立 app
#
# 在 mysite(剛剛建立的專案)底下新增 app 名稱
python manage.py startapp news
3. 設定資料庫類型帳號密碼
# 打開 settings.py
#
DATABASE_ENGINE = 'mysql' # 'postgresql_psycopg2', 'postgresql', 'mysql', 'sqlite3' or 'oracle'.
DATABASE_NAME = 'django' # Or path to database file if using sqlite3.
DATABASE_USER = 'django' # Not used with sqlite3.
DATABASE_PASSWORD = 'xxxx' # Not used with sqlite3.
DATABASE_HOST = '' # Set to empty string for localhost. Not used with sqlite3.
DATABASE_PORT = '' # Set to empty string for default. Not used with sqlite3.
4. 建立資料表
`news_id` mediumint(8) NOT NULL AUTO_INCREMENT,
`user_id` mediumint(8) NOT NULL,
`group_id` mediumint(8) NOT NULL,
`categories_id` int(4) NOT NULL,
`news_name` varchar(255) NOT NULL,
`news_desc` text NOT NULL,
`news_top` tinyint(1) NOT NULL DEFAULT '0',
`news_add_time` int(11) NOT NULL,
`news_edit_time` int(11) NOT NULL,
PRIMARY KEY (`news_id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
CREATE TABLE IF NOT EXISTS `project_news_categories` (
`categories_id` mediumint(8) NOT NULL AUTO_INCREMENT,
`categories_name` varchar(64) NOT NULL,
`add_time` int(11) NOT NULL,
`edit_time` int(11) NOT NULL,
PRIMARY KEY (`categories_id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
5. 利用 Django tool 產生系統帳號認證相關資料表
# 會依照 settings.py 裡面的 INSTALLED_APPS 設定產生相關資料表喔
python manage.py syncdb
另外反向作法:
# 可以產生全部在 database 裡面的 table 資料表,選取該對應您要的資料即可
python manage.py inspectdb
6. 開啟 admin 管理介面:設定 urls.py

上面英文部份都寫得很清楚了,如果要打開 admin 功能必須要 unmark 掉哪幾行。
7. 新增 admin.py 到 app 資料夾裡頭,檔案內容:
from django.contrib import admin
admin.site.register(ProjectNews)
admin.site.register(ProjectNewsCategories)
修改 settings.py
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.sites',
'django.contrib.admin',
'mysite.news',
)
8. 啟動伺服器,內建 python manage tool 就可以辦到了
9. 打開瀏覽器:http://localhost:8000 或者是您的 ip 跟 domain 都可以上去
10. 修改新聞系統 ForeignKey
# Create your models here.
class ProjectNews(models.Model):
news_id = models.IntegerField(primary_key=True)
user_id = models.IntegerField()
group_id = models.IntegerField()
#categories_id = models.IntegerField()
categories = models.ForeignKey("ProjectNewsCategories")
news_name = models.CharField(max_length=1020)
news_desc = models.TextField()
news_top = models.IntegerField()
news_add_time = models.IntegerField()
news_edit_time = models.IntegerField()
class Meta:
db_table = u'project_news'
def __unicode__(self):
return self.news_name
class ProjectNewsCategories(models.Model):
categories_id = models.IntegerField(primary_key=True)
categories_name = models.CharField(max_length=256)
add_time = models.IntegerField()
edit_time = models.IntegerField()
class Meta:
db_table = u'project_news_categories'
def __unicode__(self):
return self.categories_name
因為這檔案內容是依據 manage.py inspectdb 所產生的,系統並非知道我們所有 table 的關聯性,所以必須設定改掉部份關聯性,可以參考官方網站的教學 ForeignKey,介紹就到此了,後面有 template 的教學,不過就比較容易一點,就靠大家去摸索了,課程還蠻豐富的,認真玩,可以學到很多東西。
可以去下載課程講義喔:Web Framework- Django -初階 (講者:陳建玎)
Related View
Django ORM裡的預設delete行為是去模擬ON DELETE CASCADE, 主要是為了保證資料的一致性, 但是雖然在自帶的admin介面裡會提示是否要刪除其他相關聯的資料, 不過仍然可能會對某些需求帶來一些困擾, 而且到目前為止並沒有一個標準的方法來更改這個機制, 這邊我提供一個簡單的方法將model的ON DELETE CASCADE行為改為RESTRICT, 就是在需要不同機制的model裡去override orm原本的delete行為 :
def delete(self):
s = CollectedObjects()
self._collect_sub_objects(s)
if len(s.items()) == 1:
super(self.__class__, self).delete()
else:
pass
這可確保當沒有任何關聯物件時才會刪除, 否則只會安靜的pass,
this hack probably need django 1.0+.
mako template是我除了django預設的template之外,
唯一真的有在product上使用過的template,
mako對於我來說的優點是其簡單非XML的語法,
此外mako無需任何C/pyrex extension,屬於純python的實作,
非常適合在無需django及host上沒有C compiler時單獨安裝。
現在有網友替mako template做了一個django-mako的plugin,
使用mako跟django整合又更容易了。
連結:
mako:
http://www.makotemplates.org/ (LICENSE: MIT)
django-mako:
http://code.google.com/p/django-mako/ (LICENSE: apache 2.0)
今年9月6-7日的Django Conf 第一天的最後一個議程是Cal Henderson的Keynote: Why I Hate Django,其中提到很重要的一點: Django沒有吉祥物,Django需要一個具有"Awesome"跟"Magical Powers"特性的吉祥物來作代表。於是在全球Django愛好者的腦力激盪下,屬於Django自己的吉祥物出現囉! 就是avalonstar的Bryan Veloso所設計的這隻可愛的pony喔!



更多django pony的有趣資訊請參考:
http://avalonstar.com/blog/2008/sep/9/web-framework-ponies/
http://code.google.com/p/django-pony/
http://www.djangopony.com/
http://twitter.com/djangopony/
http://www.djangoproject.com/weblog/2008/sep/03/1/
Django 1.0 released!
1.0是Django project一個很重要的里程碑,因為一直以來官方對於Django 1.0有個很重要的承諾,就是在1.0之後的所有版本都將維持向前相容性,就是不論是到1.x多少版,都將維持對1.0版本程式的相容性而不會再作任何會打破相容性的重大變動。這也是為什麼1.0版本會遲遲不推出的原因。
不過1.0 release的這一天終於來了,
根據Django官方網頁的說法,自從上一個穩定版Django 0.96.2以來,到這次的1.0版本發佈,已經有超過三十五萬行的Django程式碼被修正或改變,足見改變之大。(改動350000行的python, orz)
這次總算是讓我可以使用Django的新版本了,畢竟用了0.95.x跟0.96.x實在是很久了,而Django的SVN trunk對於真的要上線的系統畢竟還是個比較危險的使用方式。不過美中不足的是debian lenny似乎還是會來不及將Django 1.0包進debian linux系統,看來以後安裝上線系統又要多費一番功夫。
想知道更詳細的改變內容跟新增功能請看Django 1.0 release notes
根據這篇Roadmap的說法, Django 1.0 會在7月alpha, 8月rc, 9月release. 雖然不知道到底準不準時, 但是"準備好了就會出來"這種話我已經聽膩了... XD
http://metajack.wordpress.com/2008/06/11/the-problem-with-django/
基本上我還滿贊同這篇文章的觀點,
事實上我甚至覺得大部分正在開發中的軟體專案都應該建立一個以時程為主的release週期, (即regular release)
而非是現在主要是以功能完成度為主的週期.
因為開發者通常都過於樂觀還有自信太強,
常常低估了完成軟體的時間, 對於沒做過的功能不管聽起來再怎麼簡單都最好還是保守點比較好,
像django的1.0也實在是拖太久了 難怪ticket#2070會被拿出來鞭... 一個http streaming upload 的patch前前後後改了兩年多還是沒進trunk...真不知道是該說追求完美還是太龜毛了... :(
像Ubuntu這樣的release週期我就覺得滿不錯的, 儘管每次的新版變動不會太大, 然後或多或少都會有bug, 但是至少是在建立一個正向循環並且能鼓勵新的開發者投入.
當然還是要說Django真的很不錯就是了. :)
目前SVN裡最新版本django已經由官方直接支援oracle資料庫,
也因此我也花了點時間測試一下django跟oracle的配合.
用起來覺得還不錯, 所以跟大家分享一下我的簡易安裝心得.
首先我是直接安裝oracle 10g 的XE版本,
在debian linux上安裝oracle 10g xe其實很簡單, (我是用etch)
因為oracle連apt套件庫都幫你準備好了.
只要在你的sources.list加上這行:
deb http://oss.oracle.com/debian/ unstable main non-free
並安裝:
#wget http://oss.oracle.com/el4/RPM-GPG-KEY-oracle -O- | sudo apt-key add -
#apt-get update;apt-get install orcale-xe-universal
最後跑個/etc/init.d/oracle-xe configure即可作oracle的安裝設定.
如果想測試安裝oracle xe的結果可以連上Web的8080port看管理介面:
http://127.0.0.1:8080/apex/
這個版本的oracle除了有內定最大只能使用4G資料庫大小,1G Memory
跟只會使用單顆CPU的限制外,
並沒有限制其他特別嚴苛的條件, 連商業使用都在可允許的範圍.
而因為這個限制其實很夠用,且高階一點的機器可以跑個vserver還是memcache.
然後你要多跑幾個database也不在限制範圍內,
所以其實我個人覺得就是oracle資料庫大放送, 隨便你用.
再來這個版本又比我印象中的oracle好安裝的太多.
還送你一個web管理介面(而且oracle似乎有心要繼續維護10g XE,我安裝時有根據官網的說明順便升級到了目前最新的apex版本3.0.1),可以說是物超所值.
再來就是安裝python的oracle支援套件cx_oracle,
因為官方網站只有提供windows跟fedora的binary套件, 我就直接抓source回來安裝,
export ORACLE_HOME='/usr/lib/oracle/xe/app/oracle/product/10.2.0/server'
export LD_LIBRARY_PATH=$ORACLE_HOME/lib
python setup.py install
接下來當然就是安裝django的最新svn版本,
這點看官方網站的Installing the development version說明應該就很清楚了,
http://www.djangoproject.com/documentation/install/
安裝完之後其實就跟其他資料庫沒什麼太大的差異了,
就可以寫個小程式測試一下了,
不過我上次測試的時候遇到了一點小問題,
就是我在syncdb時出現了一個
TypeError: descriptor 'upper' requires a 'str' object but received a 'unicode'
的錯誤訊息,
我推測應該是因為oracle這個branch剛好跟unicode這個branch同時進了svn trunk,
所以漏掉了這個,
可以暫時先依照我丟到http://code.djangoproject.com/ticket/4827的patch修正,
不過我想下一版release的django應該就會修正這個問題才對.
總算,oracle成為
django除了mysql,postgresql,sqlite之外的第四個直接支援的database.
也是第一個support的商業database.
雖然我目前用不大到(postgres還是不錯滴), 不過還是可喜可賀. :)
一直都耳聞django的apache+mod_fastcgi+thread mode在高負載狀況下有問題,
甚至也有人將之歸結於python的thread實作有問題,
所以我一直以來都是使用prefork的方式來啟動fastcgi/wsgi,
上禮拜在替django作負載調試的時候,
也發現thread mode在超高壓力測試的情況下,的確會停止運作造成service unavailable
(concurrency > 1000)
因此才花時間找出真正的原因(至少在我這邊的原因),
應該是django所採用(其實不止django, pylons跟turbogears也有採用)
的FastCGI to WSGI adapter -- flup,
在threadpool的實作上有些許的小問題, 沒有對運作異常的thread拋出例外的情形加以處理,
才導致了發生問題的thread沒有再次進入threadpool,所以運作一陣子後會讓所有thread悄悄死去.
在修正了這個問題之後, 即使在concurrency > 1000的情況下仍然保持順暢運作,
也擺脫了使用modpython或prefork mode的fastcgi大量耗用伺服器記憶體的情形,
thread mode + FastCGI/WSGI 果然才是王道!
我已提交patch, 期待新版的flup收納之後, 讓python的web framework在thread mode下運作更順利.
http://wolfram.kriesing.de/blog/index.php/2007/generate-django-project-api-docs
這篇講到如何用epydoc產生比admin裡的doc更完整的django API文件.
當然會包含自己專案裡面API的doc string.
very useful.
- Page 1 of 1 ( 12 posts )
- django













