如何用 Python 隨手寫一個 Web App?
-
Upload
keith-yang -
Category
Documents
-
view
5.718 -
download
11
description
Transcript of 如何用 Python 隨手寫一個 Web App?
如何用 Python 隨手寫一個 Web App?
從 Web Framework(s) 看網站開發模式
keitheis
PycTW 2011
PycTW 2011
關於我 keitheis
• 職稱是 Software Developer
• 業餘的 Web Developer
• 業餘中的業餘的 Python 玩家
• ID 很難念,請叫我那個玩 Python 的 Keith,會普通難念一點
• 可以在 Python Taiwan 的相關通訊地點找到我
@gmail.com
PycTW 2011
關於網站 web
• ZH.Wikipedia:
• 此條目沒有列出任何參考或來源。(2008年2月7日)維基百科所有的內容都應該可供查證。請協助添加來自可靠來源的參照以改善這篇條目。無法查證的內容可能被提出異議而移除。
• 網站(英文:Website)是指在網際網路上,根據一定的規則,使用HTML等工具製作的用於展示特定內容的相關網頁的集合。簡單地說,網站是一種通訊工具,就像布告欄一樣,人們可以通過網站來發布自己想要公開的資訊,或者利用網站來提供相關的網路服務。人們可以通過網頁瀏覽器來訪問網站,獲取自己需要的資訊或者享受網路服務。世界上第一個網站由蒂姆·伯納斯-李建立於1991年8月6日。
PycTW 2011
關於應用程式 app
• App 不就是 Application 的縮寫
• 應用軟體,或著「應用程式」
• 設計來幫助使用者完成單一或多重相關工作的電腦程式。
PycTW 2011
關於... python
• Python 是一種泛用性的動態物件導向程式語言。
• 自 1990 年代初由 Guido van Rossum (又常被稱為 GvR 或 BDFL) 創造至今已歷十數年發展,應用於系統管理、網路管理、網路傳輸程式、網頁程式開發、數值分析程式、圖形介面應用程式等方面,均有優秀的表現。
• TIOBE
• 2007 年度程式語言
• 2010 年度程式語言
http://wiki.python.org.tw/Python
PycTW 2011
關於第一個應用程式 hello world
• print “hello world”?
PycTW 2011
hello world.[php|p6|py]
• print “hello world”
• <? print “hello world”;
• “hello world”.say;
PycTW 2011
關於過去的第一個網站應用程式 hello.php
• echo “hello world”;<?php
PycTW 2011
關於恐懼、懷疑以及不確定 FUD
• echo “Fear, Uncertainty, and Doubt”;
ApacheMySQLPhP
PycTW 2011
FUD
• echo “FUD”;
Apache
MySQL
PhP
RewriteCond *.p* RewriteRule @@ = = > <
mysql -e @racle$$$$$$$$$$$$$$$$$$QL
<? php //這樣,可能會行不通吶(誤
PycTW 2011
殺雞焉用牛刀
更何況 還不知道雛雞 會不會長大
更別說 真正牛的刀 還不知是哪把犀利.py
perl6
Erlang
Golan
g
C
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
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
PycTW 2011
關於我現在的第一個網站應用程式 app.py
import bottle
@bottle.route('/')
def index():
return 'Hello World'
bottle.run(host='localhost', port=8080)
PycTW 2011
從確定會動,到開始思考程式設計 PHP
• 好久好久以前的故事,是他媽沒告訴我,這種故事可能會很長很長到天亮:
• 安裝 Apache
• 大概是安裝 MySQL
• 再安裝個 PHP,應該就會動了,吧?
PycTW 2011
自從有一天我路過陽明山下掉入一個洞五年後出來,我開始用 Python
PycTW 2011
• 自導自演的摩登故事,我本來希望它會很短…
• 安裝 Python
• 搞懂 easy_install、distribute,以及 pip
• 等等,剛剛說的 Python 3 我還沒有很懂…
• virtualenv 是什麼東西?
• install bottle...
• 等等,要在我的 Window$ 上安裝軟體?那要怎麼做?
從確定會動,到開始思考程式設計 Python
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
PycTW 2011
那些程式語言沒有告訴你的事 yak shaving
• 你想要用 XXX 寫一個很酷的東西
• 不行不行不行不行!!!!
• 不行,直到你把專案檔案架構建好
• 建構之前,至少你要安裝了一些套件
• 安裝套件之前,除非先安裝套件安裝程式
• 安裝套件安裝程式之前,先得搞懂你的作業系統要怎麼安裝套件安裝程式
• 如此一直一直不行下去…直到你了解生命的意義就可以了喔
http://learnpythonthehardway.org/book/ex46.html
PycTW 2011
說好的 Pyramid 呢?
PycTW 2011
Pylons Project
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/
Not Built by Aliens不 是外星人造的
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
PycTW 2011
還有什麼模式? What pattern else?
• 選擇:
• 雲端、遠端或本地端
• (網頁伺服器)
• (程式語言)
• (網站框架)
• (資料庫)
• ...
PycTW 2011
• HTTPServer?
• Paster
• Tornado
• nginx (uWSGI)
• Apache
• cherokee
網站伺服器 web server
PycTW 2011
• NoDatabase
• To SQL
• SQLite, PostgreSQL, MySQL, Percona...
• Not to SQL (NoSQL)
• redis, MongoDB, CouchDB, Hadoop, BigTable, Memcache...
資料庫 database
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
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/
Pylons 的洋蔥圖 WSGI middleware
http://k0s.org/mozilla/craft/wsgi.png
2009 年秋的某次作業…冏rz Non-blocking WSGI
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
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?
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/
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>
老子開❤
PycTW 2011
謝謝會眾