原文:http://www.devshed.com/c/a/Python/Karrigell-for-Python/
因?yàn)閜ython并不是特別為web開發(fā)而生,所以現(xiàn)在很多的python使用者都在開發(fā)能夠讓python運(yùn)行于web的框架.Karrigell就是現(xiàn)在為數(shù)眾多的python/web框架之一.本文將對(duì)Karrigell做簡(jiǎn)要的介紹.
簡(jiǎn)介
Karrigell是一個(gè)功能強(qiáng)大且靈活的python/web框架,為web開發(fā)提供了多種解決方案.并且,很重要的,它的安裝和使用都非常的簡(jiǎn)單.即使是python的初學(xué)者,也不會(huì)在使用Karrigell的時(shí)候犯迷糊,并且Karrigell也沒有因?yàn)榻Y(jié)構(gòu)簡(jiǎn)單而限制python的一些特性.它提供了自己的web服務(wù)器完成工作,但是也非常容易的和其他的web服務(wù)器(例如apache)結(jié)合工作,所以如果你選擇了Karrigell,你仍然可以使用之前一直在使用的web服務(wù)器.
這篇文章將從Karrigell的安裝開始說(shuō)起,介紹數(shù)個(gè)Karrigell的重要特性.
安裝Karrigell
上面說(shuō)了,Karrigell的安裝一點(diǎn)都不麻煩.你要做的第一步是到SourceForge下載最新的Karrigell,當(dāng)你下載了zip包后,將其解壓縮到一個(gè)容易找到的目錄.然后直接雙擊Karrigell.py啟動(dòng)Karrigell的內(nèi)置web服務(wù)器.如果你現(xiàn)在并不想把Karrigell和其他的web服務(wù)器結(jié)合使用,那Karrigell的安裝到此就結(jié)束了.
但如果你想要設(shè)置你的web服務(wù)器來(lái)和Karrigell結(jié)合,我們拿apache來(lái)舉例子.我們現(xiàn)在需要Karrigell在apache的后臺(tái)運(yùn)行,來(lái)使apache將相關(guān)的請(qǐng)求傳送給Karrigell
因?yàn)閍pache一般會(huì)運(yùn)行在80端口,你需要給Karrigell設(shè)置一個(gè)其他的運(yùn)行端口.有兩個(gè)方法來(lái)達(dá)到這個(gè)目的,其一是使用命令行來(lái)完成,或者可以改變Karrigell的配置文件.先來(lái)看如何用命令行,我們將在8080端口運(yùn)行Karrigell.
C:/Karrigell>Karrigell.py -P 8080
第二種,你需要找到Karrigell.ini,然后加上這么一句
port=8080
現(xiàn)在你需要配置apache將有關(guān)的請(qǐng)求轉(zhuǎn)向到Karrigell.一般來(lái)說(shuō),你希望apache可以處理任何的靜態(tài)文件請(qǐng)求,比如php.你可以和apache共享同一個(gè)路徑, 也可以設(shè)立單獨(dú)的路徑..然后設(shè)置那些文件需要apache把請(qǐng)求傳遞給Karrigell,你需要添加下面的內(nèi)容到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]
如果你想, 你可以設(shè)置全部的特定文件請(qǐng)求都轉(zhuǎn)給Karrigell.在本文中,我們將使用testarea這個(gè)路徑,所以我們這樣設(shè)置httpd.conf:
RewriteEngine On
RewriteRule ^/testarea(.*) http://localhost:8080/testarea$1 [P]
當(dāng)然你可以這樣:
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開發(fā)者使用Karrigell最容易接觸的兩個(gè)概念.Python scripts就是python的腳本,開發(fā)者使用PRint語(yǔ)句輸出到用戶瀏覽器的內(nèi)容.如果你還不明白,建立一個(gè)testarea目錄,然后我們將開始創(chuàng)建我們的第一個(gè)Python scripts.新建一個(gè)文件test.py:
print "<center>"
print "Hello!"
print "<br /><br />"
print "Karrigell is configured and working."
print "</center>"
在瀏覽器中打開這個(gè)文件,如果之前你的Karrigell都正確設(shè)置,那你將會(huì)看到輸出的內(nèi)容.
Python scripts也可以容易的使用表單.讓我們?cè)賮?lái)創(chuàng)建一個(gè)簡(jiǎn)單的頁(yè)面,用戶可以在這個(gè)頁(yè)面輸入自己的名字.新建文件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類似.這個(gè)的作用是映射請(qǐng)求到用戶指定的方法.指定方法的名字通過跟在Karrigell services后面進(jìn)行傳遞.比如,下面這個(gè)url將會(huì)調(diào)用test這個(gè)方法
http://localhost/testarea/test.ks/test
讓我們實(shí)際編寫下這個(gè)例子
def index():
print "Index function."
def test():
print "Test function."
如果不傳遞方法名而使用這些Python scripts,你的程序會(huì)默認(rèn)執(zhí)行index方法.如果傳遞了方法名test,那test方法就會(huì)被調(diào)用.調(diào)用一個(gè)不存在的方法會(huì)拋出異常.
使用Karrigell services來(lái)處理表單傳遞的數(shù)據(jù)也很簡(jiǎn)單.讓我們來(lái)創(chuàng)建一個(gè)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 + "."
當(dāng)然,允許外部公開訪問你的方法是一件很危險(xiǎn)的事情,為了阻止不允許的用戶訪問你的方法,按照下面所述給你的方法加前綴:
def _private():
pass
嘗試訪問_private方法將會(huì)拋出異常.
使用HIP
在askname.py,有一件事情值得注意,這個(gè)代碼鎘刑嗟膒rint語(yǔ)句.如果可以不使用print而直接輸出,那將會(huì)是一件多么好的事情.幸運(yùn)的是,Karrigell提供了這樣的功能.這被稱為HTML Inside Python,這將清除所有討厭的print語(yǔ)句.并且從askname.py到TML Inside Python的轉(zhuǎn)換也非常容易.我們只是需要移走那些print語(yǔ)句.刪除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將會(huì)檢查你的文件并自動(dòng)在需要的地方添加print.HTML Inside Python是Karrigell簡(jiǎn)單易學(xué)的一個(gè)有力證明.
Python Inside HTML
Karrigell提供了HTML
Inside Python,那自然的,也會(huì)提供Python Inside HTML.和一般的做法一樣,將python語(yǔ)句寫在特殊的標(biāo)記里,然后把最終結(jié)果發(fā)送到用戶的瀏覽器.讓我們來(lái)創(chuàng)建一個(gè)簡(jiǎn)單的示例,random.pih
<% import random %>
Random number: <b><% print random.random() %></b>
正如你說(shuō)看到的,Python Inside HTML的概念如此的簡(jiǎn)單.而其實(shí),代碼塊可以更加的簡(jiǎn)單:
<%= random.random() %>
但是,如果處理更復(fù)雜的邏輯,比如處理表單數(shù)據(jù)?表單數(shù)據(jù)可以像在Python scripts中被處理那樣被處理.這是有一個(gè)askname.py的復(fù)制品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 %>
請(qǐng)注意<% end %>的使用.這將標(biāo)識(shí)代碼塊的結(jié)尾,就像上面我們的條件語(yǔ)句的縮進(jìn)一樣.另一個(gè)可選擇的辦法是使用indent標(biāo)簽,這個(gè)也被用來(lái)標(biāo)識(shí)代碼縮進(jìn).
<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>
更多的特性
我們來(lái)這樣試一下,標(biāo)簽可以通過Python scripts這樣使用,tagtest.py
rom HTMLTags import *
print CENTER ( B ( "Test." ) )
session同樣可以在Karrigell被處理,并且Karrigell還提供了一個(gè)良好的接近于面向?qū)ο蟮膕ession機(jī)制.讓我們創(chuàng)建一段簡(jiǎn)單的代碼來(lái)示范Karrigell中的session.回到我們的第一個(gè)例子,用戶將會(huì)獲得一個(gè)幸運(yùn)數(shù)字.如果用戶刷新頁(yè)面,該數(shù)字仍然存在,因?yàn)檫@個(gè)數(shù)字將被保存在sessin中.當(dāng)然,用戶將可以選擇重新獲取新的幸運(yùn)數(shù)字,這通過關(guān)閉sessin來(lái)完成.創(chuàng)立一個(gè)名為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>"
結(jié)論
Karrigell提供了四種方法來(lái)進(jìn)行web開放,Python scripts,Karrigell services,HTML Inside Python和Python Inside HTML,每種方法都有其特點(diǎn),但是他們卻都有一個(gè)共同的優(yōu)點(diǎn):使用簡(jiǎn)單.Karrigell 將web開發(fā)變成了一件優(yōu)雅,簡(jiǎn)單的事情.無(wú)論是單獨(dú)使用Karrigell還是和apache結(jié)合使用,都是令人吃驚的簡(jiǎn)單.因?yàn)?無(wú)論是對(duì)于初學(xué)者,還是老手,Karrigell都是不錯(cuò)的選擇.
新聞熱點(diǎn)
疑難解答
圖片精選
網(wǎng)友關(guān)注