36
如何用 Python 隨手寫一個 Web AppWeb Framework(s) 看網站開發模式 keitheis PycTW 2011

如何用 Python 隨手寫一個 Web App?

Embed Size (px)

DESCRIPTION

從 Web Framework 看網站開發模式

Citation preview

Page 1: 如何用 Python 隨手寫一個 Web App?

如何用 Python 隨手寫一個 Web App?

從 Web Framework(s) 看網站開發模式

keitheis

PycTW 2011

Page 2: 如何用 Python 隨手寫一個 Web App?

PycTW 2011

關於我 keitheis

• 職稱是 Software Developer

• 業餘的 Web Developer

• 業餘中的業餘的 Python 玩家

• ID 很難念,請叫我那個玩 Python 的 Keith,會普通難念一點

• 可以在 Python Taiwan 的相關通訊地點找到我

@gmail.com

Page 3: 如何用 Python 隨手寫一個 Web App?

PycTW 2011

關於網站 web

• ZH.Wikipedia:

• 此條目沒有列出任何參考或來源。(2008年2月7日)維基百科所有的內容都應該可供查證。請協助添加來自可靠來源的參照以改善這篇條目。無法查證的內容可能被提出異議而移除。

• 網站(英文:Website)是指在網際網路上,根據一定的規則,使用HTML等工具製作的用於展示特定內容的相關網頁的集合。簡單地說,網站是一種通訊工具,就像布告欄一樣,人們可以通過網站來發布自己想要公開的資訊,或者利用網站來提供相關的網路服務。人們可以通過網頁瀏覽器來訪問網站,獲取自己需要的資訊或者享受網路服務。世界上第一個網站由蒂姆·伯納斯-李建立於1991年8月6日。

Page 4: 如何用 Python 隨手寫一個 Web App?

PycTW 2011

關於應用程式 app

• App 不就是 Application 的縮寫

• 應用軟體,或著「應用程式」

• 設計來幫助使用者完成單一或多重相關工作的電腦程式。

Page 5: 如何用 Python 隨手寫一個 Web App?

PycTW 2011

關於... python

• Python 是一種泛用性的動態物件導向程式語言。

• 自 1990 年代初由 Guido van Rossum (又常被稱為 GvR 或 BDFL) 創造至今已歷十數年發展,應用於系統管理、網路管理、網路傳輸程式、網頁程式開發、數值分析程式、圖形介面應用程式等方面,均有優秀的表現。

• TIOBE

• 2007 年度程式語言

• 2010 年度程式語言

http://wiki.python.org.tw/Python

Page 6: 如何用 Python 隨手寫一個 Web App?

PycTW 2011

關於第一個應用程式 hello world

• print “hello world”?

Page 7: 如何用 Python 隨手寫一個 Web App?

PycTW 2011

hello world.[php|p6|py]

• print “hello world”

• <? print “hello world”;

• “hello world”.say;

Page 8: 如何用 Python 隨手寫一個 Web App?

PycTW 2011

關於過去的第一個網站應用程式 hello.php

• echo “hello world”;<?php

Page 9: 如何用 Python 隨手寫一個 Web App?

PycTW 2011

關於恐懼、懷疑以及不確定 FUD

• echo “Fear, Uncertainty, and Doubt”;

ApacheMySQLPhP

Page 10: 如何用 Python 隨手寫一個 Web App?

PycTW 2011

FUD

• echo “FUD”;

Apache

MySQL

PhP

RewriteCond *.p* RewriteRule @@ = = > <

mysql -e @racle$$$$$$$$$$$$$$$$$$QL

<? php //這樣,可能會行不通吶(誤

Page 11: 如何用 Python 隨手寫一個 Web App?

PycTW 2011

殺雞焉用牛刀

更何況 還不知道雛雞 會不會長大

更別說 真正牛的刀 還不知是哪把犀利.py

perl6

Erlang

Golan

g

C

Page 12: 如何用 Python 隨手寫一個 Web App?

PycTW 2011

關於你的第一個網站應用程式 The Hard Way

• Exercise #50 on Learn Python The Hard Way, 2ed

• Your First Website

• lpthw.web

http://learnpythonthehardway.org/book/ex50.html

凍結的、失去魔法的 web.py

Page 13: 如何用 Python 隨手寫一個 Web App?

PycTW 2011

import web

urls = ( '/', 'index')app = web.application(urls, globals())

class index: def GET(self): greeting = "Hello World" return greeting

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

The Hard Way

Page 14: 如何用 Python 隨手寫一個 Web App?

PycTW 2011

關於我現在的第一個網站應用程式 app.py

import bottle

@bottle.route('/')

def index():

return 'Hello World'

bottle.run(host='localhost', port=8080)

Page 15: 如何用 Python 隨手寫一個 Web App?

PycTW 2011

從確定會動,到開始思考程式設計 PHP

• 好久好久以前的故事,是他媽沒告訴我,這種故事可能會很長很長到天亮:

• 安裝 Apache

• 大概是安裝 MySQL

• 再安裝個 PHP,應該就會動了,吧?

Page 16: 如何用 Python 隨手寫一個 Web App?

PycTW 2011

自從有一天我路過陽明山下掉入一個洞五年後出來,我開始用 Python

Page 17: 如何用 Python 隨手寫一個 Web App?

PycTW 2011

• 自導自演的摩登故事,我本來希望它會很短…

• 安裝 Python

• 搞懂 easy_install、distribute,以及 pip

• 等等,剛剛說的 Python 3 我還沒有很懂…

• virtualenv 是什麼東西?

• install bottle...

• 等等,要在我的 Window$ 上安裝軟體?那要怎麼做?

從確定會動,到開始思考程式設計 Python

Page 18: 如何用 Python 隨手寫一個 Web App?

PycTW 2011

• 自導自演的摩登故事,我本來希望它會很短,於是我們假裝它很短吧:

安裝 Python

$ curl -O https://raw.github.com/pypa/pip/master/contrib/get-pip.py

$ python get-pip.py

$ pip install bottle

從確定會動,到開始思考程式設計 Python

update: http://quest.keitheis.org/post/6713569631/pip-install-on-windows-linux-mac

Page 19: 如何用 Python 隨手寫一個 Web App?

PycTW 2011

那些程式語言沒有告訴你的事 yak shaving

• 你想要用 XXX 寫一個很酷的東西

• 不行不行不行不行!!!!

• 不行,直到你把專案檔案架構建好

• 建構之前,至少你要安裝了一些套件

• 安裝套件之前,除非先安裝套件安裝程式

• 安裝套件安裝程式之前,先得搞懂你的作業系統要怎麼安裝套件安裝程式

• 如此一直一直不行下去…直到你了解生命的意義就可以了喔

http://learnpythonthehardway.org/book/ex46.html

Page 20: 如何用 Python 隨手寫一個 Web App?

PycTW 2011

說好的 Pyramid 呢?

Page 21: 如何用 Python 隨手寫一個 Web App?

PycTW 2011

Pylons Project

Page 22: 如何用 Python 隨手寫一個 Web App?

PycTW 2011

Pyramid 不是一天造成的 Pylons Project

• Python 的 Web Framework 名單(只會)持續增長,但選擇將愈趨精簡

• 因理念相似,得社群合併的力量

• Pylons (多半靠 benbangert) 與 100% coverage 的 repoze.bfg (達 80 個

commit 提交者)的合併

Pylons & repoze.bfg Merger - or - Where'd Pylons 2.0 go?https://groups.google.com/d/topic/pylons-discuss/l_qhijQpoo4/discussion

PyCon: State of Pylons/TurboGears 2/repoze.bfg http://jjinux.blogspot.com/2011/04/pycon-state-of-pylonsturbogears.html

“The Shrinking Python Web Framework World” by Ian Bicking http://blog.ianbicking.org/2007/08/21/the-shrinking-python-web-framework-world/

Page 23: 如何用 Python 隨手寫一個 Web App?

Not Built by Aliens不 是外星人造的

Page 24: 如何用 Python 隨手寫一個 Web App?

PycTW 2011

回顧今年的金框獎 Golden Framework Awards

• Pylons Project: Pyramid 1.0, TurboGears 2.1.1

• Bottle 0.9, Flask

• web2py 1.96.4

• Django 1.3

• Zope, CherryPy, web.py, Tornado...

• 還是不要列太多,免得讓大家以為除了鐵路三(rails III)還有什麼好選的。

http://wiki.python.org/moin/WebFrameworks

Page 25: 如何用 Python 隨手寫一個 Web App?

PycTW 2011

還有什麼模式? What pattern else?

• 選擇:

• 雲端、遠端或本地端

• (網頁伺服器)

• (程式語言)

• (網站框架)

• (資料庫)

• ...

Page 26: 如何用 Python 隨手寫一個 Web App?

PycTW 2011

• HTTPServer?

• Paster

• Tornado

• nginx (uWSGI)

• Apache

• cherokee

網站伺服器 web server

Page 27: 如何用 Python 隨手寫一個 Web App?

PycTW 2011

• NoDatabase

• To SQL

• SQLite, PostgreSQL, MySQL, Percona...

• Not to SQL (NoSQL)

• redis, MongoDB, CouchDB, Hadoop, BigTable, Memcache...

資料庫 database

Page 28: 如何用 Python 隨手寫一個 Web App?

PycTW 2011

• 語法 ${escape(foo)} 或著 {{bar | escape}};% if 或 <% if %>

• ${escape(default(get_name(user), "No Name"))}

• {{ user | get_name | default('No Name') | escape }}

• 容不容易替換?Django 內建樣板

• 能跑在要發佈的平台上 (Jython, Google App Engine, IronPython, Heroku...)

• Jinja2、Mako、Chameleon (ZPT)...

樣板引擎 template engine

Page 29: 如何用 Python 隨手寫一個 Web App?

PycTW 2011

Web Server Gateway Interface WSGI

• 化整為零的次世代網頁開發標準

• 天下GI一大抄

• PSGI - Perl version of WSGI

• Rack - Ruby version of WSGI

http://blog.ez2learn.com/2010/01/27/introduction-to-wsgi/

Page 30: 如何用 Python 隨手寫一個 Web App?

Pylons 的洋蔥圖 WSGI middleware

http://k0s.org/mozilla/craft/wsgi.png

Page 31: 如何用 Python 隨手寫一個 Web App?

2009 年秋的某次作業…冏rz Non-blocking WSGI

Page 32: 如何用 Python 隨手寫一個 Web App?

PycTW 2011

寄信者 mailer

• 看 Rails 3: Action Mailer

• pyramid_mailer

• 直接拿 kai/lib/mail.py 過來用

• Lamson:像在寫 web 一樣寫郵件伺服器?“a framework for building kickass email applications”

https://bitbucket.org/bbangert/kai/

http://amix.dk/blog/post/19608

Page 33: 如何用 Python 隨手寫一個 Web App?

PycTW 2011

呼叫 HTTP testing HTTP

• pip install Requests

• import requests

• r = requests.get('http://google.com')

• >>> r.status_code

• 401

• r2 = requests.get( 'http://localhost:5000')

• >>> r.headers['content-type']

• >>> r.content

• request.put(...

• request.delete(...

http://pypi.python.org/pypi/requests

urllib?

Page 34: 如何用 Python 隨手寫一個 Web App?

PycTW 2011

Flask 的模式文件 patterns for flask

• Larger Applications

• Application Factories

• Application Dispatching

• Deploying with Distribute

• Deploying with Fabric

• Using SQLite 3 with Flask

• SQLAlchemy in Flask

• Uploading Files

• Caching

• View Decorators

• Form Validation with WTForms

• Template Inheritance

• Message Flashing

• AJAX with jQuery

• Custom Error Pages

• Lazily Loading Views

• MongoKit in Flask

• Adding a fav ❤ icon

http://flask.pocoo.org/docs/patterns/

Page 35: 如何用 Python 隨手寫一個 Web App?

PycTW 2011

模式:流行款 MVC

• 好像沒有用一下感覺不是很良好?

• 一個開始思考關於模組化、重構的起點

• 就叫你不要把 SQL、程式邏輯與 HTML 通通塞在一起<!DOCTYPE html> <!-- 如果是 HTML5 的話,可以喔(誤 --><html><body><script><?phq $sql = “select hours.* from my_time”; ?>var feel=<? $result = db->query($sql); if ($result == $many) echo “老子開心”; ?>;alert(feel);</script></body></html>

老子開❤

Page 36: 如何用 Python 隨手寫一個 Web App?

PycTW 2011

謝謝會眾