python web.py安裝使用


官方首頁: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://localhost:8080/hello

官方教程: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+將匹配數字)。圓括號表示捕捉對應的數據以便后面使用。第二部分是接受請求的類名稱,像indexviewwelcomes.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 模板.

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM