• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            隨筆-167  評(píng)論-8  文章-0  trackbacks-0

            web.py 是一個(gè)Python 的web 框架,它簡(jiǎn)單而且功能強(qiáng)大。web.py 是公開的,無論用于什么用途都是沒有限制的。

            先讓大家感受一下web.py 的簡(jiǎn)單而強(qiáng)大:

            import web
            
            urls = (
                '/(.*)', 'hello'
            )
            
            class hello:
                def GET(self, name):
                    i = web.input(times=1)
                    if not name: name = 'world'
                    for c in xrange(int(i.times)): print 'Hello,', name+'!'
            
            if __name__ == "__main__": web.run(urls, globals())

            看看,上面就是一個(gè)基于web.py 的完整的Web 應(yīng)用。不信?!將上面的代碼保存為文件code.py,在命令行下執(zhí)行python code.py。然后打開你的瀏覽器,打開地址:http://localhost:8080/RossWan,看看結(jié)果 :)沒有意外的話(當(dāng)然要先安裝web.py,下面會(huì)有介紹),瀏覽器會(huì)顯示“Hello, RossWan!”。這是一個(gè)最簡(jiǎn)單的Hello world Web 應(yīng)用。是不是很簡(jiǎn)單?!下面將較為詳細(xì)地介紹下web.py 。Find fun :)

            1. 安裝

            單擊這里下載web.py 的安裝文件,將下載得到的文件web.py-0.21.tar.gz 解壓,進(jìn)入解壓后的文件夾,在命令行下執(zhí)行:python setup.py install,在Linux 等系統(tǒng)下,需要root 的權(quán)限,可以執(zhí)行:sudo python setup.py install。

            安裝完畢之后,就可以正式開始web.py 之旅…

            2. URL 處理

            對(duì)于一個(gè)站點(diǎn)來說,URL 的組織是最重要的一個(gè)部分,因?yàn)檫@是用戶看得到的部分,而且直接影響到站點(diǎn)是如何工作的,在著名的站點(diǎn)如:del.icio.us ,其URLs 甚至是網(wǎng)頁界面的一部分。而web.py 以簡(jiǎn)單的方式就能夠構(gòu)造出一個(gè)強(qiáng)大的URLs。

            在每個(gè)web.py 應(yīng)用,必須先import web 模塊:

            import web

            現(xiàn)在,我們須要告訴web.py URL 如何組織,讓我們以一個(gè)簡(jiǎn)單例子開始:

            urls = (
              '/', 'index'    )

            在上面的例子中,第一部分(‘/’)是一個(gè)匹配URL 的正則表達(dá)式,像/,/help/faq,/item/(\d+),等等;第二部分(‘index’)是一個(gè)類名,匹配的請(qǐng)求將會(huì)被發(fā)送過去。

            現(xiàn)在,我們需要編寫index 類。當(dāng)大部人瀏覽網(wǎng)頁的時(shí)候,他們都沒有注意到,瀏覽器是通過HTTP 跟World Wide Web 通信的。通信的細(xì)節(jié)不太重要,但要明白一點(diǎn),用戶是通過URLs(例如 / 或者 /foo?f=1)來請(qǐng)求web 服務(wù)器完成一定請(qǐng)求的(例如 GET 或者POST)。

            GET 是最普遍的方法,用來請(qǐng)求一個(gè)頁面。當(dāng)我們?cè)跒g覽器里輸入“harvard.edu” 的時(shí)候,實(shí)際上它是向Web 服務(wù)器請(qǐng)求GET ”/“。另一個(gè)常見的方法是POST,常用于提交特定類型的表單,例如利用信用卡付費(fèi)和處理一個(gè)訂單。注意,GET URLs 能夠被搜索引擎索引得到(想像一下Google 嘗試購買你網(wǎng)站上的所用物品)。

            在我們的web.py 代碼中。我們清晰區(qū)分這兩種方法:

            class index:
                def GET(self):
                    print "Hello, world!"

            當(dāng)接收到一個(gè)GET 請(qǐng)求時(shí),上面的GET 方法將會(huì)被web.py 調(diào)用。

            好的。現(xiàn)在,我們只需添加最后一行代碼,讓web.py 啟動(dòng)網(wǎng)頁應(yīng)用:

            if __name__ == "__main__": web.run(urls, globals())

            上面告訴web.py 如何配置URLs,以及找尋的類在文件中的全局命名空間。

            整個(gè)code.py 文件的內(nèi)容如下:

            import web
            
            urls = (
              '/', 'index'    )
            
            class index:
                def GET(self):
                    print "Hello, world!"
            
            if __name__ == "__main__": web.run(urls, globals())
            

            注意到?jīng)]有,雖然我說了很多東西,但實(shí)際上web 應(yīng)用的代碼就只得上面的幾行,而且這是一個(gè)完整的web.py 應(yīng)用。在你的命令行下輸入:

            $ python code.py
            Launching server: http://0.0.0.0:8080/

            現(xiàn)在,你的web.py 應(yīng)用已經(jīng)啟動(dòng)了服務(wù)器。通過瀏覽器訪問http://localhost:8080/ 的話,會(huì)見到”Hello, world!“。在啟動(dòng)服務(wù)器的時(shí)候,你可以在python code.py 后面添加IP 地址/端口 來控制web.py 啟動(dòng)的服務(wù)器。例如:python code.py 8888。

            3. 調(diào)試

            web.py 本身也提供調(diào)試的工具。在最后的“if name …” 代碼前面添加:

            web.webapi.internalerror = web.debugerror

            并在最后的“if name …” 添加”web.reloader“:

            if __name__ == "__main__": web.run(urls, globals(), web.reloader)

            上面的代碼會(huì)使你在調(diào)試的階段得到更多有用的信息。web.reloader 其實(shí)是一個(gè)中間件,當(dāng)你在運(yùn)行時(shí)修改了code.py 文件后,web.reloader 會(huì)重新加載code.py 文件,讓你在瀏覽器上立刻可以看到變化。如何有多何變化的話,還是需要重新啟動(dòng)服務(wù)器。web.py 也提供web.profiler ,可以輸出有用的信息,有關(guān)每個(gè)頁面的每個(gè)函數(shù)調(diào)用的次數(shù),這用助于你改善代碼。

            4. 模板

            在Python 里面編寫HTML 代碼是相當(dāng)累贅的,而在HTML 里嵌入Python 代碼則有趣得多。幸運(yùn)地,web.py 使這過程變得相當(dāng)容易。

            注意:舊版本的web.py 是用Cheetah templates 模板的,你可以繼續(xù)使用,但官方已不再提供支持。

            在我們的web 應(yīng)用里,添加一個(gè)新的文件夾用來組織模板文件(例如”/templates“)。然后再新建一個(gè)HTML 文件(例如:”index.html“):

            <em>Hello</em>, world!

            或者,你可以用web.py 的模板語言用編寫這個(gè)HTML 文件:

            $def with (name)
            
            $if name:
                I just wanted to say <em>hello</em> to $name.
            $else:
                <em>Hello</em>, world!

            注意上面代碼的縮進(jìn)!

            正如你所見的,上面的模板看上去跟這Python 文件很相似,以def with 語句開始,但在關(guān)鍵字前需要添加”$“。

            注意:在模板內(nèi)的變量,如果包含有HTML 標(biāo)記,以$ 方式引用變量的話,HTML 標(biāo)記只會(huì)以純文本的顯示出來。要想HTML 標(biāo)記產(chǎn)生效果,可以用$: 引用變量。

            現(xiàn)在,回到code.py 文件,在”import web” 的下一行添加:

            render = web.template.render('templates/')

            這告訴web.py 在哪里可以搜索得到模板目錄。

            提示:可在render 調(diào)用里添加cache = False 使得每次訪問頁面時(shí)都重載模板。

            下面繼續(xù)修改code.py 文件的GET 方法:

            def GET(self):
                name = 'Bob'
                print render.index(name)

            上面的”index“ 是模板的名字,”name“ 是傳遞過去的參數(shù)。

            修改code.py 文件的urls 變量:

            urls=(
                '/(.*)', 'index')

            上面的“/(.*)” 是一個(gè)正則表達(dá)式。

            再將GET 方法修改如下:

            def GET(self,name):
                print render.index(name)

            現(xiàn)在,訪問”/“的話,會(huì)顯示”Hello, world!“;訪問”/Joe“ 的話,會(huì)顯示”I just want to say hello to Joe“。

            如果你想學(xué)習(xí)更多關(guān)于web.py templates 的話,可以訪問templetor page

            5. 數(shù)據(jù)庫

            注意:在你開始連接數(shù)據(jù)庫之前,請(qǐng)先安裝正確的數(shù)據(jù)庫驅(qū)動(dòng)。例如,MySQL 使用MySALdb,Postgre 使用psycopg2

            添加以下代碼,則可以正確配置你的數(shù)據(jù)庫:

            web.config.db_parameters = dict(
                dbn='postgres',
                user='username',
                pw='password',
                db='dbname'
            )

            現(xiàn)在,先行在數(shù)據(jù)庫里創(chuàng)建一個(gè)簡(jiǎn)單的表:

            CREATE TABLE todo (
              id serial primary key,
              title text,
              created timestamp default now(),
              done boolean default 'f'
            );

            初始化一行:

            INSERT INTO todo (title) VALUES ('Learn web.py');

            回到code.py,修改GET 方法如下:

            def GET(self):
                todos = web.select('todo')
                print render.index(todos)

            修改urls 變量:

            urls = (
                '/', 'index')

            重新編輯index.html 文件如下:

            $def with (todos)
            <ul>
            $for todo in todos:
                <li id="t$todo.id">$todo.title</li>
            </ul>

            現(xiàn)在,可以訪問”/“,如果顯示”Learn web.py“,則祝賀你成功了!

            現(xiàn)在,再讓我們看看如何向數(shù)據(jù)庫寫入。

            在index.html 文件的尾部添加如下內(nèi)容:

            <form method="post" action="add">
               <p>
                   <input type="text" name="title" />
                   <input type="submit" value="Add" />
               </p>
            </form>

            修改code.py 文件的urls 變量如下:

            urls = (
                '/', 'index',
                '/add', 'add'
            )

            在code.py 里添加一個(gè)類:

            class add:
                def POST(self):
                    i = web.input()
                    n = web.insert('todo', title=i.title)
                    web.seeother('/')

            web.input 使你能夠方便地訪問用戶通過表單提交上來的變量。web.insert 用于向數(shù)據(jù)庫的 “todo” 表插入數(shù)據(jù),并且返回新插入行的ID。web.seeother 用于重轉(zhuǎn)向到”/“。

            提示:對(duì)于數(shù)據(jù)庫的操作,還有web.transact(), web.commit(), web.rollback(),web.update()。

            在web.py 里,還有web.input,web.query 和其它的函數(shù),返回”Storage objects”,可以像字典型類(dictionaries) 的使用。

            6. 總結(jié)

            web.py 的確相當(dāng)?shù)男∏?,?yīng)當(dāng)歸屬于輕量級(jí)的web 框架。但這并不影響web.py 的強(qiáng)大,而且使用起來很簡(jiǎn)單、很直接。在實(shí)際應(yīng)用上,web.py 更多的是學(xué)術(shù)上的價(jià)值,因?yàn)槟憧梢钥吹礁鄔eb 應(yīng)用的底層,這在當(dāng)今“抽象得很好”的web 框架上是學(xué)不到的 :) 如果想了解更多web.py,可以訪問web.py 的官方文檔。

            這篇教程到這里也要結(jié)束了,如果你對(duì)web.py 有興趣,可以搜索更多關(guān)于web.py 的文檔看看,你一定會(huì)發(fā)現(xiàn)更酷的東西。Have fun!

            參考資料

            http://webpy.org/tutorial2.en

            posted on 2009-12-22 11:25 老馬驛站 閱讀(948) 評(píng)論(0)  編輯 收藏 引用 所屬分類: python
            久久水蜜桃亚洲av无码精品麻豆| av无码久久久久不卡免费网站| 久久成人精品视频| 精品无码久久久久久尤物| 午夜欧美精品久久久久久久| 亚洲精品美女久久777777| 久久99国内精品自在现线| www久久久天天com| 老司机国内精品久久久久| 久久se精品一区精品二区国产| 久久婷婷五月综合97色直播| 亚洲伊人久久综合影院| 久久精品欧美日韩精品| 欧美精品一本久久男人的天堂| 青青草国产成人久久91网| 久久电影网| 无码人妻久久一区二区三区免费 | 久久精品国产免费| AA级片免费看视频久久| 伊人久久大香线蕉综合5g| 久久久一本精品99久久精品66| 大美女久久久久久j久久| 人人狠狠综合久久亚洲| 久久久久AV综合网成人| 久久99精品久久久久久水蜜桃 | 亚洲日本久久久午夜精品| 性做久久久久久久| 国内精品久久久久久久影视麻豆| 午夜视频久久久久一区 | 精品久久久久久久久免费影院| 久久精品国产亚洲av水果派| 久久国产精品视频| 欧美午夜精品久久久久免费视| 国产精品久久久久久久久久免费| 久久无码中文字幕东京热| 嫩草影院久久国产精品| 狠狠色综合网站久久久久久久高清| 国产精自产拍久久久久久蜜| 欧美熟妇另类久久久久久不卡| 久久国产精品波多野结衣AV| 国产精品久久永久免费|