官方首頁:http://webpy.org/)
它的源代碼非常整潔精干,學習它一方面可以讓我們快速了解python語法(遇到看不懂的語法就去google),另一方面可以學習到python高級特性的使用(譬如反射,裝飾器),而且在webpy中還內置了一個簡單HTTP服務器(文檔建議該服務器僅用於開發環境,生產環境應使用apache之類的),對於想簡單了解下HTTP服務器實現的朋友來說,這個是再好不過的例子了(並且在這個服務器代碼中,還可以學習到線程池,消息隊列等技術),除此之外webpy還包括模板渲染引擎,DB框架等等,這里面的每一個部分都可以單獨拿出來學習.
在JavaWeb開發中有Servlet規范,那么Python Web開發中有規范嗎?
答案就是:WSGI,它定義了服務器如何與你的webapp交互
關於WSGI規范,可以參看下面這個鏈接:
http://ivory.idyll.org/articles/wsgi-intro/what-is-wsgi.html (非常好的web.py源碼學習:
【Python】Webpy 源碼學習(一))
安裝:
安裝web.py, 請先下載:
http://webpy.org/static/web.py-0.37.tar.gz
或者獲取最新的開發版:
https://github.com/webpy/webpy/tarball/master
解壓並拷貝 web 文件夾到你的應用程序目錄下。 或者,為了讓所有的應用程序都可以使用,運行:
python setup.py install (
注意: 在某些類unix系統上你可能需要切換到root用戶或者運行:
sudo python setup.py install
查看 推薦設置.
另外一個選擇是使用Easy Install. Easy Install 使用如下:
easy_install web.py
或者 PIP
sudo pip install web.py
我下的是0.37版本。
建立一個hello.py:
import web urls = ('/hello', 'hello', ) class hello(object): def GET(self): return 'hello world' if __name__ == "__main__": app = web.application(urls, globals()) app.run()
urls是映射規則(類似servlet映射)。hello是請求處理。
運行該文件:
python hello.py
我運行報錯:
F:\pythonSource>python webpyFirst.py
Traceback (most recent call last):
File "webpyFirst.py", line 12, in <module>
app.run()
File "D:\ProgramFiles\python2.7\lib\site-packages\web\application.py", line 31
3, in run
return wsgi.runwsgi(self.wsgifunc(*middleware))
File "D:\ProgramFiles\python2.7\lib\site-packages\web\wsgi.py", line 55, in ru
nwsgi
server_addr = validip(listget(sys.argv, 1, ''))
File "D:\ProgramFiles\python2.7\lib\site-packages\web\net.py", line 108, in va
lidip
if validip6addr(ip): return (ip,port)
File "D:\ProgramFiles\python2.7\lib\site-packages\web\net.py", line 33, in val
idip6addr
socket.inet_pton(socket.AF_INET6, address)
AttributeError: 'module' object has no attribute 'inet_pton'
解決方法,修改Python安裝目錄下Lib\site-packages\web\net.py文件的第32到第35行:
(原來的是:
try: socket.inet_pton(socket.AF_INET6, address) except socket.error: return False
)
改成:
try: socket.inet_pton(socket.AF_INET6, address) except: return False
參考:https://github.com/webpy/webpy/pull/195#issuecomment-19143945
改正后運行下面的命令:
F:\pythonSource>python webpyFirst.py
http://0.0.0.0:8080/
輸入網址http://0.0.0.0:8080/ 可是訪問不了,網上搜了下可以指定ip:host,例如python hello.py 127.0.0.1:1234 即可正常訪問。
輸入:
127.0.0.1:1234/hello
即可輸出hello world.
后來發現,不指定參數,直接用localhost也可以訪問:
官方教程:http://webpy.org/tutorial3.zh-cn
任何網站最重要的部分就是它的URL結構。你的URL並不僅僅只是訪問者所能看到並且能發給朋友的。它還規定了你網站運行的心智模型。在一些類似del.icio.us的流行網站 , URL甚至是UI的一部分。 web.py使這類強大的URL成為可能。
在開始你的web.py程序之前,打開一個文本文件(文件名為code.py)輸入:
import web
這條語句會導入web.py模塊。
現在我們需要把我們的URL結構告訴web.py。讓我從下面這個簡單的例子開始:
urls = (
'/', 'index'
)
第一部分是匹配URL的正則表達式,像/
、/help/faq
、/item/(\d+)
等(\d+
將匹配數字)。圓括號表示捕捉對應的數據以便后面使用。第二部分是接受請求的類名稱,像index
、view
、welcomes.hello
(welcomes
模塊的hello
類),或者get_\1
。\1
會被正則表達式捕捉到的內容替換,剩下來捕捉的的內容將被傳遞到你的函數中去。
這行表示我們要URL/
(首頁)被一個叫index
的類處理。
現在我們需要創建一個列舉這些url的application。
app = web.application(urls, globals())
這會告訴web.py去創建一個基於我們剛提交的URL列表的application。這個application會在這個文件的全局命名空間中查找對應類。
code.py:
import web urls = ( '/', 'index' ) class index: def GET(self): return "Hello, world!" if __name__ == "__main__": app = web.application(urls, globals()) app.run()
模板
在 Python 中寫 HTML 不是聰明的選擇,相反在 HTML 中寫 Python 則有趣的多。幸運的是,web.py
讓這件事情做得簡單而又漂亮。
注意: 老版本的 web.py
使用 Cheetah 模板系統,你可以也歡迎使用其他模板系統,但它可能不會被長久支持。
給模板新建一個目錄(命名為 templates
),在該目錄下新建一個以 .html
結尾的文件,內容如下:
<em>Hello</em>, world!
你也可以在模板中使用 web.py
模板支持代碼:
$def with (name)
$if name:
I just wanted to say <em>hello</em> to $name.
$else:
<em>Hello</em>, world!
如上,該模板看起來就像 python 文件一樣,除了頂部的 def with
(表示從模板將從這后面取值)和總是位於代碼段之前的$
。當前,template.py
首先請求模板文件的首行 $def
。當然,你要注意 web.py
將會轉義任何任何用到的變量,所以當你將 name
的值設為是一段 HTML 時,它會被轉義顯示成純文本。如果要關閉該選項,可以寫成 $:name
來代替 $name
。
回看再看 code.py
。在第一行之下添加:
render = web.template.render('templates/')
這會告訴web.py到你的模板目錄中去查找模板。然后把 index.GET
改成: 告訴 web.py
在你的模板目錄下查找模板文件。修改 index.GET
:
name = 'Bob'
return render.index(name)
('index' 是模板的名字,'name' 是傳入模板的一個參數)
訪問站點它將顯示 hello Bob。
但是如果我們想讓用戶自行輸入他的名字,么辦?如下:
i = web.input(name=None)
return render.index(i.name)
訪問 /
將顯示 hello world,訪問 /?name=Joe
將顯示 hello Joe。
URL 的后面的 ?
看起來不好看?修改下 URL 配置:
'/(.*)', 'index'
然后修改下 index.GET
:
def GET(self, name):
return render.index(name)
現在訪問 /Joe
看看,它會顯示 hello Joe。
如果學習更多關於 web.py 的模板處理,請訪問 web.py 模板.