四月 21, 2010
» (又)一個小而美的 Python 網站框架:Flask

荒廢好久的網誌,因有沒有網站開發經驗的人寫信問我關於 Pylons 的問題,特此更新一文。

聲明在先,此文並不是為了回答 Pylons 的問題而寫的,而是分享另一個 Web Framework(是的,又來了)。 

近日聽說了一個看來更小,更簡單而且(表面)也很優雅的 Python 網站框架:Flask

我想對沒有相關經驗的人而言,東西愈小愈容易學習,如果這東西還有良好而成熟的設計,那就更棒了。Flask 正是一個看起來像這樣的東西。在 Python 經歷了 ZopeDjangoTurboGearsPylonsBottle 等等網站框架之後,還是有人另外寫了這個網站框架,我猜……它別有意圖

 不過它意圖在官網也寫得很清楚,就是(另)一個微網站框架(Micro Web Framework)。什麼是「微」(micro)?原諒我忍不住想在這裡簡單地說,就是「很小」(very small)。(給認真魔人的連結:"Flask - Foreword - What does Micro Mean?")

好吧官網上還寫了一些也許有點可口的菜單:

都流口水了。不過不免一提上述的功能 Pylons 也幾乎都內建了。

呃,時光匆匆,我該睡了,最後幾分鐘剛好來裝個網站框站跑個應用程式起來。

安裝:(更詳細的官網安裝說明連結
easy_install Flask

寫一個 Hello 網站應用程式(都這種時候了,當然是從官網上複製過來的):
檔名:hello.py


from flask import Flask
app = Flask(__name__)

@app.route("/")
def hello():
    return "Hello World!"

if __name__ == "__main__":
    app.run()


跑:
python hello.py

四月 20, 2010
» (又)一個小而美的 Python 網站框架:Flask

荒廢好久的網誌,因有沒有網站開發經驗的人寫信問我關於 Pylons 的問題,特此更新一文。

聲明在先,此文並不是為了回答 Pylons 的問題而寫的,而是分享另一個 Web Framework(是的,又來了)。 

近日聽說了一個看來更小,更簡單而且(表面)也很優雅的 Python 網站框架:Flask

我想對沒有相關經驗的人而言,東西愈小愈容易學習,如果這東西還有良好而成熟的設計,那就更棒了。Flask 正是一個看起來像這樣的東西。在 Python 經歷了 ZopeDjangoTurboGearsPylonsBottle 等等網站框架之後,還是有人另外寫了這個網站框架,我猜……它別有意圖

 不過它意圖在官網也寫得很清楚,就是(另)一個微網站框架(Micro Web Framework)。什麼是「微」(micro)?原諒我忍不住想在這裡簡單地說,就是「很小」(very small)。(給認真魔人的連結:“Flask - Foreword - What does Micro Mean?“)

好吧官網上還寫了一些也許有點可口的菜單:

都流口水了。不過不免一提上述的功能 Pylons 也幾乎都內建了。

呃,時光匆匆,我該睡了,最後幾分鐘剛好來裝個網站框站跑個應用程式起來。

安裝:(更詳細的官網安裝說明連結
easy_install Flask

寫一個 Hello 網站應用程式(都這種時候了,當然是從官網上複製過來的):
檔名:hello.py


from flask import Flask
app = Flask(__name__)


@app.route("/")
def hello():
return "Hello World!"

if __name__ == "__main__":
app.run()


跑:
python hello.py

二月 23, 2010
» 'hello world' ab tests between pylons 0.9.7 and node.js v0.1.30

A rough play, just for fun.

pylons code:

class HelloController(BaseController):

    def index(self):
        return 'Hello World'


Configuration of prod.ini:

debug = false
...
set debug = false

run with:
paster serve prod.ini

node.js code:

var sys = require('sys'),
   http = require('http');

http.createServer(function (req, res) {
    res.writeHeader(200, {'Content-Type': 'text/plain'});
    res.write('Hello World');
    res.close();
}).listen(8000);

sys.puts('Server running at http://0.0.0.0:8000/');

//(filename: serv.js)

run with:
node serv.js
Result of Pylons:

 % ab -kc 10 -t 10 http://192.168.7.77:8000/

Benchmarking 192.168.7.77 (be patient)
Completed 5000 requests
Finished 6325 requests


Server Software:        PasteWSGIServer/0.5
Server Hostname:        192.168.7.77
Server Port:            8000

Document Path:          /
Document Length:        11 bytes

Concurrency Level:      10
Time taken for tests:   10.094 seconds
Complete requests:      6325
Failed requests:        0
Write errors:           0
Keep-Alive requests:    0
Total transferred:      1341099 bytes
HTML transferred:       69575 bytes
Requests per second:    632.49 [#/sec] (mean)
Time per request:       15.810 [ms] (mean)
Time per request:       1.581 [ms] (mean, across all concurrent requests)
Transfer rate:          130.90 [Kbytes/sec] received

Connection Times (ms)
              min  mean[+/-sd] median   max
Connect:        0    2  84.2      0    2997
Processing:     2   12  22.1     10     644
Waiting:        1   10  22.0      8     640
Total:          2   15  90.4     10    3639

Percentage of the requests served within a certain time (ms)
  50%     10
  66%     12
  75%     12
  80%     13
  90%     15
  95%     17
  98%     22
  99%     47
 100%   3639 (longest request)


Resulf of node.js:

% ab -kc 10 -t 10 http://192.168.7.77:8000/

Benchmarking 192.168.7.77 (be patient)
Completed 5000 requests
Completed 10000 requests
Completed 15000 requests
Completed 20000 requests
Completed 25000 requests
Completed 30000 requests
Completed 35000 requests
Completed 40000 requests
Completed 45000 requests
Finished 50000 requests


Server Software:       
Server Hostname:        192.168.7.77
Server Port:            8000

Document Path:          /
Document Length:        11 bytes

Concurrency Level:      10
Time taken for tests:   6.185093 seconds
Complete requests:      50000
Failed requests:        0
Write errors:           0
Keep-Alive requests:    0
Total transferred:      3750000 bytes
HTML transferred:       550000 bytes
Requests per second:    8083.95 [#/sec] (mean)
Time per request:       1.237 [ms] (mean)
Time per request:       0.124 [ms] (mean, across all concurrent requests)
Transfer rate:          592.07 [Kbytes/sec] received

Connection Times (ms)
              min  mean[+/-sd] median   max
Connect:        0    0   0.0      0       0
Processing:     0    0   3.5      0      81
Waiting:        0    0   3.5      0      80
Total:          0    0   3.5      0      81

Percentage of the requests served within a certain time (ms)
  50%      0
  66%      1
  75%      1
  80%      1
  90%      1
  95%      1
  98%      1
  99%      2
 100%     81 (longest request)

九月 25, 2009
» 用 Spawning 來跑 Pylons

當然,是在 easy_install Spawning (或 pip Spawning) 之後。在原來的 development.ini


[server:main]
use = egg:Paste#http
host = 127.0.0.1
port = 5000

改成

[server:main]
#use = egg:Paste#http
use = egg:Spawning
num_processes = 2
host = 127.0.0.1
port = 5000

Enjoy ;)

八月 22, 2009
» Pylons 歷史

This is a Chinese translation of Pylons History

Pylons 0.8 (2005-2006)


在一個許多 Python 開發框架(Framework) (30+) 爭於增加使用者的年代,Ben Bangert 發現另一個 Python 開發框架, Bricks,有相似的目標,便與 James Gardner 合作併力於 Web 開發框架,即為 Pylons。

Pylons 初次現於 2005 年九月,開始時是一個 Myghty 的 Python 模版(Templating) 框架,利用客製的頁面處理(handler)來提供一個 MVC 導向的的 Web 開發框架。時 Pylons 使用 Myghty 的 WSGI 處理,跑在 Paste 上。

不同於當時多數的 Python 框架,Pylons 致力於利用 WSGI 規格來對 Web 應用堆疊(stack) 提供一個彈性的元件基礎方法。Session 管理、快取(Cache)、預設模版語言,以及 Request/Response 物件都是交由 Myghty 處理,而 Paste 則用於載入並執行應用程式。

Pylons 0.9 - 0.9.7 (2006 - 2008)


Pylons 0.9 釋出在 O'Reilly 舉辦的 2006 OSCON 期間,為它自身內部的架構帶來一些主要的改變。

客製 Myghty 的頁面處理形式已非最佳設計決定,Pylons 0.9 以完全執行為 WSGI 應用程式,做了一個清楚的分割,只使用到原本 Myghty 中的頁面模版。藉由第三方套件 Beaker,一個 Myghty 用於快取/Session 的子系統來做 Session 管理及快取。Request 與 Response 物件則由 Paste 中輕量級的 WSGI Wrappers,Paste 仍用於執行並載入 Web 應用程式。

在開發 0.9 系列間,Paste 的數個功能被抽出,成為更小、更目的集中的套件。測試工具成為 WebTest,WSGI Wrappers 成為 WebOb,且互動除錯環境成為 WebError。Pylons 0.9 跟著這些發展,由使用 Paste 切換到提供更多功能性的新的套件,且幾乎很少有向後不容相的問題。

Pylons 1.0 及之後 (2009-)


Pylons 1.0 目標於利用近年來與 Pylons 共生發展所新抽出而成熟的 Python 套件,成為完整而精鍊的 Web 應用框架。

目前預測是在 2009 前半年間釋出 Pylons 1.0。

譯記

關鍵字:Pylons, Python, WSGI, MVC, Web Framework

如有錯誤還請指教 :)

二月 23, 2009
» Pylons - Web 開發瑞士刀

Pylons - Web 開發瑞士刀.pdf @ scribd
昨天在 Kalug 給的 Topic,經善後的 PDF。請點擊圖片享用。

Update: 投影片可直接在 KaLUG Meeting 上下載,不必登入 scribd.

二月 20, 2009
» Mako 簡介

This is a Chinese translation of introduction on Mako web site.

Mako 是一個以 Python 寫成的模版函式庫。它提供了一個熟悉的、非 XML 語法,並將之編譯入 Python 模組以取得最大效能。Mako 的語法及 API 汲取於其它模版的精要,包含 Django 的模版、Cheetah、Myghty,以及 Genshi。概念上,Mako 是一個嵌入 Python 的語言,並提煉如元件化排版(Layout)及繼承等熟悉的概念,來產生最直接而彈性的可得模型之一,同時與 Python 的呼叫及範籌語義保持緊密。

python.org 使用 Mako 做為其網站的建構系統基礎(README),而 reddit.com 亦用於他們新上線的 beta 網站。它也是 Pylons 網站框架的預設模版語言。

一月 17, 2009
» Pylons & PycTW2008 圓滿結束之投影片告白

2008 年 6 月 15 日,PycTW2008 正式展開,也正式結束(這不是廢話嗎)。不僅有吃有喝又有玩,還有高手環伴,可以說只差個人來七步吟詩了(誤)。我也在疲勞 的抗奮狀態下,講了 Pylons Session。可惜在準備不足,時間又抓得不夠好,只 demo 了一個 Hello Pylons,應該還有一卡車可以講啊啊!!所以這個故事告訴我們:要早點睡。

最後要感謝 thinker 大力發起與讚助的單位,期待明年的 2009 - Python 大逃殺!?(又誤)

» 在 Google App Engine 1.1.7 上跑 Pylons 0.9.7 RC4

版本資訊:
OS: Ubuntu 8.10
Python 2.5.4
Pylons 0.97rc4
Google App Engine 1.1.7

步驟:

svn checkout http://appengine-monkey.googlecode.com/svn/trunk/ appengine-monkey
python2.5 appengine-boot.py --paste-deploy my-app
## my-app 可改為你的想要的應用程式名稱,如:hellopylons)
>> Enter template_engine (mako/genshi/jinja/etc: Template language) ['mako']:
>> Enter sqlalchemy (True/False: Include SQLAlchemy 0.4 configuration) [False]:
>> Enter google_app_engine (True/False: Setup default appropriate
>> for Google App Engine) [False]:True
cd my-app
source bin/activate
easy_install Pylons
cd src
paster create --template=pylons MyApplication
## MyApplication 依樣可自訂其名稱
cd my-app/src/MyApplication
python setup.py develop
cd ../..
python -m pth_relpath_fixup

編輯 my-app/development.ini:
[app:the-app]
## Change this to whatever you name your application:
use = egg:MyApplication

到此與 appengine-monkey 上差不多,但接著要多幾個動作才能見到 Welcome:

一.
File ".../appengine-monkey/my-app/src/MyApplication/MyApplication/config/environment.py", line 34, in load_environment
module_directory=os.path.join(app_conf['cache_dir'], 'templates'),
KeyError: 'cache_dir'
避免如上錯誤,編輯 my-app/src/MyApplication/config/environment.py,註解掉一行:
        ...
#module_directory=os.path.join(app_conf['cache_dir'], 'templates'),
...

二.
VersionConflict: (WebOb 0.9 (.../google_appengine/lib/webob), Requirement.parse('WebOb>=0.9.4'))
移走 google_appengine/lib/webob 來避免這錯誤:
mv google_appengine/lib/webob/ google_appengine/webob/

即 Google Appengine 1.1.7 隨附的 webob 版本 (0.9) 未達 Pylons 0.9.7 的要求 'WebOb>=0.9.4'
註:如果你有跑其它 App Engine apps,這個 google_appengine 最好單獨就給 Pylons 使用,以免造成其它程式的問題。

好,是時候了:
/usr/bin/python2.5 google_appengine/dev_appserver.py my-app
## 我使用自己 compile 的 /usr/bin/local/python2.5 google_appengine/dev_appserver.py my-app
主要參考:
Appengine-Monkey: http://code.google.com/p/appengine-monkey/wiki/Pylons

註二:
自己 compile 的 Python 要支援 SSL 才能跑 Google App Engine,在 Ubuntu 8.10 下就是裝完 libssl-dev 後重新 make && make install。

八月 25, 2008
» Let's begin! Pylons 0.97 RC1 Frontpage

七月 14, 2008
» Pylons 書籍免費下載



http://pylonsbook.com/

六月 11, 2008
» 很忙

我們都很忙。於是 Pylons 提供了一連串叫好的 In A Hurry 系列,給來不及的眾生一個機會?

更忙一點的人,也許需要小抄了: Pylons Cheatsheet

六月 7, 2008
» Pylons 0.9.7 內建支援 SQLAchemy 組態設定

在 Pylons 0.9.7 中已內建支援自動產生對 SQLAchemy 的組態設定,情況大概是這樣:

(virpylons)[k]@XO % PYTHONPATH='' paster create -t pylons sqlarmy
Selected and implied templates:
Pylons#pylons Pylons application template

Variables:
egg: sqlarmy
package: sqlarmy
project: sqlarmy
Enter sqlalchemy (True/False: Include SQLAlchemy 0.4 configuration) [False]: _

嗯,好不容易。其自動化的部分大概如 Working with databases and SQLAlchemy 這一段所示,這是目前在 Pylons 0.9.6 所需要DIY的部份。

附註,因為我設了自己的 PYTHONPATH,如果沒把它清空 (PYTHONPATH=''),跑 paster 指令時裝的 pylons 會在我個人預設的套件位置找到 0.9.6 版,而非我用 go-pylons.py 產生 virtualenv 中的 0.9.7 版,讓我困擾了一小下,怎麼沒有 sqlalchemy 的化學反應?XD

六月 5, 2008
» PycTW2008 Memo

PycTW2008 (Python Conference @ Taiwan 2008) 即將在 6/15 舉行;人數滿檔中!

小弟目前準備的主題,是關於 Pylons,在 google 搜尋結果中看到我以為很棒的簡單介紹:「a python rapid web application development framework frequently compared to rails and with an emphasis on speed and fun.」Yeah, it's fun!

希望我在這次的議程中能探討到的一些議題(能讓台下的人睡得更甜一點):

  1. Python 有太的 web framework,為何選擇 Pylons?而非 Django、TurboGears (2?)、web2py,或?mez_xml?Python on Rails?
  2. Pylons 的未來在哪裡?0.9.6.1 -> 0.9.7 -> 1.0! (Pylons Roadmap to 1.0)
    相關議題:
而附贈的簡單秀是:
  • Python dance with Vim
  • nosetest, Storm ORM, SqlAchemy in Pylons
並期待那天的名產點心

biggo.com.tw

A Django site.