高見龍

iOS app/Ruby/Rails Developer & Instructor, 喜愛非主流的新玩具 :)

Django簡介

Django? 低尖勾?

Django這個名字是取名自某個吉它手Django Reinhardt。當初Django是因為開發某個新聞網站而產生的,開發的人覺得這個framework似乎很不錯用,後來就把它open source出來給大家用。

Django這個看起來不太好讀的單字,有的人會有邊讀邊,沒邊讀中間,其實Django的D是不發音的,不過不管是台灣人或是外國人,我都有聽到人唸做"低尖勾"的讀音。不管如何,反正你知道它是什麼就行了。

如果你對它的正確讀音有興趣,可以點這裡聽聽看怎麼唸。

軟體授權

Django是採用BSD License的,也就是說,你幾乎可以拿它來做任何事,包括商業行為,所以你可以放心的把它用在你的個人或公司的專案上。

這東西穩不穩啊?

我覺得還不錯,我自己個人用了三、四個專案,其中也包括一些短期、高流量的活動案,都還滿耐得住操的。你也可以從這個網站看看目前世界上還有哪些網站是在用Django的。

支援的Python版本?

以現行的Django 1.3.1來說,Python 2.4到2.7都是支援的。那Python 3呢? 目前還不行!

Hosting的問題

在台灣,其實不是很多主機空間都有支援Python/Django,所以Hosting可能會是個麻煩。通常主機我會選擇自己架設,彈性比較大,要裝什麼軟體、元件比較不會受限制。通常有的是會在企業內部自己架設,有的是去機房租機櫃,而我目前則採用AWS的solution。

國外的話就比較多方案了,可參考 https://code.djangoproject.com/wiki/DjangoFriendlyWebHosts

參考資料

在之前還有一些坊間的參考書籍可以參考,不過隨著Django版本的更新,目前比較有跟上最新版本進度(目前是1.3.1)的資料,大概只剩官網的文件了,所以其它的資料可以不看,官網的文件一定得全部看過一回。在翻官網文件的時候也要注意,確定讀的文件版本是正確的。

Django會很難學嗎?

Django會需要一些技術基礎,你至少會需要先學會Python的基本操作,知道Python的程式怎麼執行、module怎麼寫;如果你曾經有用其它語言(例如PHP)開發過網站的話,也許在上手會輕鬆一點點。如果你知道Design Pattern是做什麼的,也是有幫助的。

基本上,我覺得並不會非常難學,但只要不開始,就永遠學不會 :)

PHPConf Taiwan 2011 is Launching

image

網址:http://phpconf.tw/2011

第一屆的台灣 PHP 開發者年會起跑囉!

在一群熱血朋友的支持與踴躍參與下,我們開始籌措了 PHPConf Taiwan 2011 ,從原先計畫的 20 至 30 人的小聚會,到現在居然有將近 150 人說要參加,而且在 OSSF 大力奔走下,第一屆就可以跟其他大型研討會一樣辦在中研院!

11/12 (六) 在中研院「人文社會科學館」的第二會議室,我們一同來參與這場盛會!

報名時間︰10/21 (五) 下午 01:30 ,報名人數︰ 100 人。

歡迎有興趣的朋友們一起來吧!

物件導向程式設計

建立類別(Class)

類別命名建議:首字大寫

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
class ClassA(object):
  def __init__(self):
    print "Hello Python!"

  def __del__(self):
    print "Goodbye Python!"

  def __str__(self):
    return "This is Class A"

  def say_hello(self, words):
    print "Hello,", words

  def do_nothing(self):
    pass

a = ClassA()
a.say_hello("eddie")
print a

# 執行結果
Hello Python!
Hello, eddie
This is Class A
Goodbye Python!

其中,__init__就是會在物件被建立出來的時候被呼叫的程式碼,而__del__則是物件用完被回收時候執行的程式碼。

private method

Python的類別裡,所有的方法預設都是public的,但有些時候,有些method你就是不想讓隨便就被拿到,在別的程式語言會有publicprotectedprivate之類的method修飾詞來設定,不過Python沒有這樣的東西,而是使用2個底線

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
class ClassB(object):
  def __private_method(self):
    print "this is for personal only"

  def get_private_method(self):
    self.__private_method()

b = ClassB()

b.__private_method()
# 執行結果
# AttributeError: 'ClassB' object has no attribute '__private_method'

b.get_private_method()
# 執行結果
# this is for personal only

繼承

1
2
3
4
5
6
7
8
9
class FatherClass(object):
  def say_hello(self, words):
    print "Hello,", words

class SonClass(FatherClass):
  pass

son = SonClass()
son.say_hello("Python")

可多重繼承,但若父類別同時有同名之method,需注意多重繼承之順序

1
2
3
4
5
6
7
8
9
10
11
12
class FatherClass(object):
  def say_hello(self, words):
      print "Hello,", words

class MotherClass(object):
  pass

class SonClass(FatherClass, MotherClass):
  pass

son = SonClass()
son.say_hello("Python")

更多精彩內容,請見官網文件:http://docs.python.org/tutorial/classes.html

模組

懂得用模組,你的人生就會是彩色的..

這已經不是一人個蠻幹的時代了,在Python,Module可以說是Python的生命也不為過。其實不管是哪種程式語言,不管是內建的函式庫,或是別人寫好的程式碼,可以直接拿來用,才有機會可以早早下班回家或在上班時間打混摸魚又可以把工作準時完成!

巨人的肩膀要怎麼踩

要把module給拉進來用,用的是import語法,不過import跟斯斯一樣也有兩種寫法,直接看程式碼看看有什麼不同:

imoprt module

1
2
import decimal
print decimal.Decimal('0.1') + decimal.Decimal('0.1') + decimal.Decimal('0.1') - decimal.Decimal('0.3')

另一種from..import..的用法:

1
2
from decimal import Decimal
print Decimal('0.1') + Decimal('0.1') + Decimal('0.1') - Decimal('0.3')

如何安裝別人寫好的module

懂得如何善用官方/3rd party寫好的module,可以讓你事半功倍。若想知道該電腦裡是否有安裝某個module,最簡單的方法就是當你在import該module的時候會出現ImportError

>>> import django
Traceback (most recent call last):
    File "<stdin>", line 1, in <module>
ImportError: No module named django

動手寫 Module

老是靠別人寫好的,我們也來動手練習寫看看。

module也是Python程式碼而已

我們將建立兩個檔案test.pymy_mod.pytest.py是我們的主程式,而my_mod.py則是我們的module。

my_mod.py很單純,就只放了一個簡單的method:

1
2
def happy_python():
  print "Happy Python"

為了管理方便,我建了一個叫做happy的資料夾,裡面放了一個__init__.py的空檔案,並且把my_mod.py也一起放進去,整個資料夾的結構看起來會像這樣:

image

再來,我們的test.py主程式大概就長這樣:

1
2
import happy.my_mod
happy.my_mod.happy_python()

嫌看起來有點囉嗦嗎? 你也可以改用from..import..的方式來改寫:

1
2
from happy.my_mod import happy_python
happy_python()

其實寫模組沒想像中的困難吧 :)

那個__init__.py是幹嘛的?

每個套件裡都必須存在__init__.py這個檔案,它的目的就是告訴Python說這個資料夾請把它當做模組來對待。__init__.py可以是空的,也可以放一些變數或程式在裡面。

例外處理

世事多變化,總是會有萬一..

當程式出錯的時候,你可以選擇就讓它壞掉不理它,或是選擇做一些例外處理:

try..except

>>> print b
Traceback (most recent call last):
    File "<stdin>", line 1, in <module>
NameError: name 'b' is not defined

因為因為沒有定義b這個變數,所以它會拋出一個NameError的錯誤訊息,使用例外處理可以來捕捉並處理它:

1
2
3
4
try:
  print b
except NameError, e:
  print "there is no b"

finally 不管如何一定會執行

1
2
3
4
5
6
try:
  print b
except NameError, e:
  print "there is no b"
finally:
  print "no matter what happened.."

else

如果try區塊內沒有發生例外,則else區塊就會執行:

1
2
3
4
5
6
7
b = "bbb"
try:
  print b
except NameError, e:
  print "there is no b"
else:
  print "there is no error"

raise

主動拋出例外

>>> raise NameError