又是Python。呵呵。誰(shuí)叫人家?guī)浤?/span>
Quixote的部署
在Quixote官方白皮書(shū)中已經(jīng)詳細(xì)描述了Quixote的工作模式。Quixote可以使用Python自代的http_server(主要用于開(kāi)發(fā)調(diào)試)和與Apache(或lighttpd)配合使用。
Quixote與Apache配合使用方式如下:
- 使用CGI,文檔中稱(chēng)為egular CGI。被認(rèn)為效率最低的一種方式,因?yàn)槊恳粋€(gè)請(qǐng)求都會(huì)創(chuàng)建一個(gè)新的進(jìn)程。
- 使用fastCGI,CGI可以運(yùn)行fastCGI一定是可以應(yīng)用的。這也是豆瓣采用的方式。在Quixote作者的一個(gè)PPT中,他認(rèn)為fastCGI是buggy的。哦:(也不至于啊。我們正在尋找使用fastCGI的部署經(jīng)驗(yàn)。
- 使用mod_python,將python代碼嵌入到Apache中。
- 使用SCGI,這是作者推薦的。使用Apache SCGI module scgi_mod將遵循SCGI協(xié)議Apache將請(qǐng)求發(fā)送到相應(yīng)的Socket如localhost:3001。而這個(gè)Socket由本地運(yùn)行的一個(gè) Python程序打開(kāi)。這個(gè)Python程序?qū)⑻幚碚?qǐng)求,并返回結(jié)果。
SCGI的配置
Quixote的網(wǎng)站上對(duì)SCGI的描述:SCGI協(xié)議是CGI協(xié)議的替代。它是一種應(yīng)用程序與HTTP服務(wù)接口標(biāo)準(zhǔn)。它有些像FastCGI但他的設(shè)計(jì)更容易實(shí)現(xiàn)。
配置SCGI過(guò)程如下:
- 安裝各個(gè)模塊不在話(huà)下,debian讓程序員有了懶惰的美德:
#aptitude install libapache2-mod-scgi python-scgi python-quixote
- Apache的配置,添加配置到apache.conf。(有些教程中加入了SetHandler scgi-handler ,但這個(gè)加上就很本不會(huì)和3000通信??赡苁前姹镜膯?wèn)題。最好不用。)
<Location "/qx">
SCGIServer localost:3000
SCGIHandler On
</Location>
配置完成。SCGI的好處在于,修改了Python程序,不用重啟Apache,只要重啟SCGI就可以了。
第一個(gè)Quixote程序
一切就緒,我們來(lái)一次Quixote的完整之旅。
- scgi程序要求有一個(gè)服務(wù)打開(kāi)3000端口。啟動(dòng)scgi的程序如下:
1
2 #!/usr/bin/python
3 # -*- coding: utf-8 -*-
4
5 from scgi.quixote_handler import QuixoteHandler, main
6 from quixote import enable_ptl
7 from quixote.publish import Publisher
8 enable_ptl() #啟動(dòng)PTL
9
10 def create_publisher():
11 from ourroot import RootDirectory
12 return Publisher(RootDirectory(), display_exceptions='plain')
13
14 if __name__ == '__main__':
15 from quixote.server import scgi_server
16 scgi_server.run(create_publisher, port=3000, script_name="/qx")
17
- 程序結(jié)構(gòu)是比較簡(jiǎn)單的,使用的是scgi_server的run方法。要注意的是run方法中的script_name和前面apache 的配置Location是一樣的。程序的關(guān)鍵是導(dǎo)入了ourroot這樣一個(gè)ptl 。下面是我們的第一個(gè)ptl程序。
1
2 # -*- coding: utf-8 -*-
3 """這個(gè)是我們第一個(gè)例子的根目錄
4 """
5 from quixote.directory import Directory
6
7 class RootDirectory(Directory):
8 _q_exports = [""]
9 def _q_index [html] (self):
10 print "debug message from the index page"
11 """
12 <html>
13 <head>
14 <meta http-equiv="Content-Type" content="text/html charset=UTF-8" />
15 <title>第一個(gè)例子</title>
16 </head>
17 <body>
18 <h1>第一個(gè)例子有中文!</h1>
19 </body>
20 </html>
21 """
22
- 現(xiàn)在在瀏覽器中輸入http://localhost/qx就可以看到結(jié)果了。
- 除了運(yùn)行上面的python腳本,也可以采用這樣的方式運(yùn)行scgi:
python /var/lib/python-support/python2.5/quixote/server/scgi_server.py \
--factory=FirstApp.create_publisher \
--script-name=/qx --port=3000
Quixote 中文化的要點(diǎn)
Quixote的中文設(shè)置好像很麻煩。其實(shí)隨著python、Quixote版本的推進(jìn),現(xiàn)在這個(gè)問(wèn)題已經(jīng)很簡(jiǎn)單了。字符集使用的是utf-8。使用gb2312可能也是可以的。
- 所有源代碼使用utf-8在程序的開(kāi)始加上# -*- coding: utf-8 -*-
- ptl的html模板加上content="text/html charset=UTF-8"
- 關(guān)鍵:在quixote的安裝路徑下有__init__.py,將其中的DEFAULT_CHARSET = 'iso-8859-1'改成 'utf-8'
- 也可以不修改__init__.py,使用Publisher的時(shí)候把Publisher擴(kuò)展一下:
1 class UTF8Publisher(Publisher):
2 quixote.DEFAULT_CHARSET = "utf-8"