四月 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 ;)

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

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

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

一月 17, 2009
» 在 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。

biggo.com.tw

A Django site.