原文:http://www.devshed.com/c/a/Python/Karrigell-for-Python/
因為python並不是特別為web開發而生,所以現在很多的python使用者都在開發能夠讓python運行於web的框架.Karrigell就是現在為數眾多的python/web框架之一.本文將對Karrigell做簡要的介紹.
簡介
Karrigell是一個功能強大且靈活的python/web框架,為web開發提供了多種解決方案.並且,很重要的,它的安裝和使用都非常的簡單.即使是python的初學者,也不會在使用Karrigell的時候犯迷糊,並且Karrigell也沒有因為結構簡單而限制python的一些特性.它提供了自己的web伺服器完成工作,但是也非常容易的和其他的web伺服器(例如apache)結合工作,所以如果你選擇了Karrigell,你仍然可以使用之前一直在使用的web伺服器.
這篇文章將從Karrigell的安裝開始說起,介紹數個Karrigell的重要特性.
安裝Karrigell
上面說了,Karrigell的安裝一點都不麻煩.你要做的第一步是到SourceForge下載最新的Karrigell,當你下載了zip包後,將其解壓縮到一個容易找到的目錄.然後直接雙擊Karrigell.py啟動Karrigell的內置web伺服器.如果你現在並不想把Karrigell和其他的web伺服器結合使用,那Karrigell的安裝到此就結束了.
但如果你想要設定你的web伺服器來和Karrigell結合,我們拿apache來舉例子.我們現在需要Karrigell在apache的後台運行,來使apache將相關的請求傳送給Karrigell
因為apache一般會運行在80端口,你需要給Karrigell設置一個其他的運行端口.有兩個方法來達到這個目的,其一是使用命令行來完成,或者可以改變Karrigell的配置文件.先來看如何用命令行,我們將在8080端口運行Karrigell.
C:Karrigell>Karrigell.py -P 8080
第二種,你需要找到Karrigell.ini,然後加上這麼一句
port=8080
現在你需要配置apache將有關的請求轉向到Karrigell.一般來說,你希望apache可以處理任何的靜態文件請求,比如php.你可以和apache共享同一個路徑, 也可以設立單獨的路徑..然後設置那些文件需要apache把請求傳遞給Karrigell,你需要添加下面的內容到apache的httpd.conf 檔案.
RewriteEngine On
RewriteRule ^/(.*).py(.*) http://localhost:8080/$1.py$2 [L,P]
RewriteRule ^/(.*).ks(.*) http://localhost:8080/$1.ks$2 [L,P]
RewriteRule ^/(.*).hip(.*) http://localhost:8080/$1.hip$2 [L,P]
RewriteRule ^/(.*).pih(.*) http://localhost:8080/$1.pih$2 [P]
如果你想, 你可以設定全部的特定檔案請求都轉給Karrigell.在本文中,我們將使用testarea這個路徑,所以我們這樣設定httpd.conf:
RewriteEngine On
RewriteRule ^/testarea(.*) http://localhost:8080/testarea$1 [P]
當然你可以這樣:
RewriteEngine On
RewriteRule ^/testarea/(.*).py(.*)
http://localhost:8080/testarea/$1.py$2 [L,P]
RewriteRule ^/testarea/(.*).ks(.*)
http://localhost:8080/testarea/$1.ks$2 [L,P]
RewriteRule ^/testarea/(.*).hip(.*)
http://localhost:8080/testarea/$1.hip$2 [L,P]
RewriteRule ^/testarea/(.*).pih(.*)
http://localhost:8080/testarea/$1.pih$2 [P]
Scripts和Services
Python scripts和Karrigell services將是python開發者使用Karrigell最容易接觸的兩個概念.Python scripts就是python的腳本,開發者使用print語句輸出到使用者瀏覽器的內容.如果你還不明白,建立一個testarea目錄,然後我們將開始創建我們的第一個Python scripts.新建一個檔案test.py:
print "<center>"
print "Hello!"
print "<br /><br />"
print "Karrigell is configured and working."
print "</center>"
在瀏覽器中開啟這個檔案,如果之前你的Karrigell都正確設定,那你將會看到輸出的內容.
Python scripts也可以容易的使用表單.讓我們再來創建一個簡單的頁面,用戶可以在這個頁面輸入自己的名字.新建文件askname.py:
if QUERY.has_key ( "name" ):
print "Your name is", _name + "."
else:
print "What is your name?<br />"
print "<form>"
print "<input type='text' name='name' /><br />"
print "<input type='submit' value='Proceed' />"
print "</form>"
Karrigell services的編寫和Python scripts類似.這個的作用是映射請求到用戶指定的方法.指定方法的名字通過跟在Karrigell services後面進行傳遞.比如,下面這個url將會調用test這個方法
http://localhost/testarea/test.ks/test
讓我們實際寫下這個範例
def index():
print "Index function."
def test():
print "Test function."
如果不傳遞方法名稱而使用這些Python scripts,你的程式會預設執行index方法.如果傳遞了方法名稱test,那test方法就會被呼叫.呼叫一個不存在的方法會拋出異常.
使用Karrigell services來處理表單傳遞的資料也很簡單.讓我們來建立一個ascname.ks
def index():
print "What is your name?<br />"
print "<form action='nameSubmit'>"
print "<input type='text' name='name' /><br />"
print "<input type='submit' value='Proceed' />"
print "</form>"
def nameSubmit ( name ):
print "Your name is", name + "."
當然,允許外部公開訪問你的方法是一件很危險的事情,為了阻止不允許的用戶訪問你的方法,按照下面所述給你的方法加前綴:
def _private():
pass
嘗試存取_private方法將會拋出異常.
使用HIP
在askname.py,有一件事情值得注意,這個代碼鎘刑?嗟膒rint語句.如果可以不使用print而直接輸出,那將會是一件多麼好的事情.幸運的是,Karrigell提供了這樣的功能.這被稱為HTML Inside Python,這將清除所有討厭的print語句.並且從askname.py到TML Inside Python的轉換也非常容易.我們只是需要移走那些print語句.刪除askname.py裡的print並將檔案重新命名為askname.hip
f QUERY.has_key ( "name" ):
"Your name is", _name + "."
else:
"What is your name?<br />"
"<form method='POST'>"
"<input type='text' name='name' /><br />"
"<input type='submit' value='Proceed' />"
"</form>"
這就是HTML Inside Python.Karrigell將會檢查你的文件並自動在需要的地方添加print.HTML Inside Python是Karrigell簡單易學的一個有力證明.
Python Inside HTML
Karrigell提供了HTML
Inside Python,那自然的,也會提供Python Inside HTML.和一般的做法一樣,將python語句寫在特殊的標記裡,然後把最終結果發送到用戶的瀏覽器.讓我們來創建一個簡單的示例, random.pih
<% import random %>
Random number: <b><% print random.random() %></b>
正如你說看到的,Python Inside HTML的概念如此的簡單.而其實,程式碼區塊可以更加的簡單:
<%= random .random() %>
但是,如果處理更複雜的邏輯,比如處理表單資料?表單資料可以像在Python scripts中被處理那樣被處理.這是有一個askname.py的複製品askname.pih
<% if QUERY.has_key ( "name" ): %>
Your name is <%= _name %>.
<% end %>
<% else: %>
What is your name?<br />
<form method='POST'>
<input type='text' name='name' /><br />
<input type='submit' value='Proceed' />
</form>
<% end %>
請注意<% end %>的使用.這將標識代碼塊的結尾,就像上面我們的條件語句的縮進一樣.另一個可選擇的辦法是使用indent標籤,這個也被用來標識程式碼縮排.
<indent>
<% if QUERY.has_key ( "name" ): %>
Your name is <%= _name %>.
<% else: %>
What is your name?<br />
<form method='POST'>
<input type='text' name='name' /><br />
<input type='submit' value='Proceed' />
</form>
</indent>
更多的特性
我們來這樣試一下,標籤可以透過Python scripts這樣使用,tagtest.py
rom HTMLTags import *
print CENTER ( B ( "Test." ) )
session同樣可以在Karrigell被處理,並且Karrigell還提供了一個良好的接近於面向對象的session機制.讓我們創建一段簡單的程式碼來示範Karrigell中的session.回到我們的第一個例子,用戶將會獲得一個幸運數字.如果用戶刷新頁面,該數字仍然存在,因為這個數字將被保存在sessin中.當然,用戶將可以選擇重新獲取新的幸運數字,這透過關閉sessin來完成.創立一個名為luckynumber.ks的Karrigell services,輸入下面的代碼:
import random
user = Session()
def index():
if not "luckyNumber" in dir ( user ):
user.luckyNumber = random.randint ( 0, 20 )
print "Your lucky number:", user.luckyNumber
print "<br /><br />"
print "<a href='reset'>Reset Lucky Number</a>"
def reset():
user.close()
print "Your lucky number has been reset."
print "<br /><br />"
print "<a href='index'>Back</a>"
結論
Karrigell提供了四種方法來進行web開放,Python scripts,Karrigell services,HTML Inside Python和Python Inside HTML,每種方法都有其特點,但是他們都有一個共同的優點:使用簡單.Karrigell 將web開發變成了一件優雅,簡單的事情.無論是單獨使用Karrigell還是和apache結合使用,都是令人吃驚的簡單.因為,無論是對於初學者,還是老手,Karrigell都是不錯的選擇.