摘要:特別提醒,看官不要自宮,因為本教程不是辟邪劍譜,也不是葵花寶典,撰寫本課程的人更是生理健全者。直到目前,科學上尚未有證實或證偽自宮和寫程序之間是否存在某種因果關系。和是中用的最多的方法啦。
"Do not store up for yourselves treasures on earth, where moth and rust consume and where thieves break in and steal; but store up for yourselves treasures in heaven, where neither moth and rust consumes and where thieves do not break in and steal. For where your treasure is, there your heart will be also." (MATTHEW6:19-21)
在開發(fā)網站的過程中,post和get是常見常用的兩個方法,關于這兩個方法的詳細解釋,請列為閱讀這篇文章:《HTTP POST GET 本質區(qū)別詳解》,這篇文章前面已經推薦閱讀了,可以這么說,如果看官沒有搞明白get和post,也可以寫出web程序,但是,只要遇到“但是”,就說明另有乾坤,但是如果看官要對這方面有深入理解,并且將來能上一個檔次,是必須了解的。這就如同你要練習辟邪劍譜中的劍法,不自宮,也可以練,但是無法突破某個極限,岳不群也不傻,最終他要成為超一流,就不惜按照劍譜中開篇所說“欲練神功,揮刀自宮”,“神功”是需要“自宮”為前提,否則,練出來的不是“神功”,無法問鼎江湖。
特別提醒,看官不要自宮,因為本教程不是辟邪劍譜,也不是葵花寶典,撰寫本課程的人更是生理健全者。若看官自宮了,責任自負,與本作者無關。直到目前,科學上尚未有證實或證偽自宮和寫程序之間是否存在某種因果關系。所以提醒看官慎重行事。
還是扯回來,看下面的代碼先:
#!/usr/bin/env python #coding:utf-8 import textwrap import tornado.httpserver import tornado.ioloop import tornado.options import tornado.web from tornado.options import define, options define("port", default=8000, help="Please send email to me", type=int) class ReverseHandler(tornado.web.RequestHandler): def get(self, input_word): self.write(input_word[::-1]) class WrapHandler(tornado.web.RequestHandler): def post(self): text = self.get_argument("text") width = self.get_argument("width", 40) self.write(textwrap.fill(text, width)) if __name__ == "__main__": tornado.options.parse_command_line() app = tornado.web.Application( handlers = [ (r"/reverse/(w+)", ReverseHandler), (r"/wrap", WrapHandler) ] ) http_server = tornado.httpserver.HTTPServer(app) http_server.listen(options.port) tornado.ioloop.IOLoop.instance().start()
這段代碼跟上一講的代碼相比,基本結構是一樣的,但是在程序主體中,這次寫了兩個類ReverseHandler和WrapHandler,這兩個類中分別有兩個方法get()和post()。在tornado.web.Application()實例化中,handlers的參數(shù)值分別設置了不同路徑對應這兩個類。
其它方面跟上一講的代碼一樣。
把上述代碼的文件,存到某個目錄下,我給他取名為:request_url.py,名字看官也可以自己定。然后進入該目錄,運行:python request_url.py,就將這個tornado框架的網站以端口8000發(fā)布了。
打開網頁,在瀏覽器中輸入:http://localhost:8000/reverse/qiwsirpython
界面上輸出什么結果?
還可以在命令終端,用下面方式調試,跟在網頁上輸出是等同效果。
qw@qw-Latitude-E4300:~$ curl http://localhost:8000/reverse/qiwsirpython nohtypriswiq
再看另外一個路徑,看官運行的是否是下面的結果呢?
qw@qw-Latitude-E4300:~$ curl http://localhost:8000/wrap -d text=I+love+Python+programming+and+I+am+writing+python+lessons+on+line I love Python programming and I am writing python lessons on line
調試通過,就開始分析其中的奧妙。
get()在ReverseHandler類中,定義了這個方法。
class ReverseHandler(tornado.web.RequestHandler): def get(self, input_word): self.write(input_word[::-1])
這個get()方法要和下面Application實例化中的路徑:
(r"/reverse/(w+)", ReverseHandler),
關聯(lián)起來看。
首先看路徑設置:r"/reverse/(w+)",這個路徑的意思就是可以在瀏覽器的url中輸入:http://localhost:8000/reverse/ffffdd,這個樣子的地址,注意路徑中的(w+),是正則表達式,在reverse/的后面可以輸入一個或者多個包括下劃線的任何單詞字符。也就是ffffdd可以更換為任何其它字母或者下劃線,一個或者多個均可以。
在URL中輸入的這個地址,就被ReverseHandler類中的get()方法接收,這就是(r"/reverse/(w+)", ReverseHandler)之含義了。那么,ReverseHandler中的get()方法如何接收url中傳遞過來的信息呢?
前文已經說過,在def get(self, input_word)中,self參數(shù)在類實例化后對應的是tornado.web.RequestHandler,另外一個參數(shù)input_word用來接收來自url的信息,但是它只接收所設置的路徑尾部數(shù)據(jù),也就是路徑r"/reverse/(w+)"中reverse后面的第一個分割符號“/”之后的內容,都被input_word接收過來,即正則表達式的內容。
input_word接收過來的對象,是什么類型呢?猜測一下,從前面程序的運行結果看,肯定是某種序列類型的對象。具體是哪種呢?可以實驗。
將get方法修改為:
def get(self, input_word): input_type = type(input_word) self.write("%s"%input_type)
再運行程序,打印出來的是:
qw@qw-Latitude-E4300:~$ curl http://localhost:8000/reverse/qiwei
這說明,get()方法通過URL接收到的數(shù)據(jù)類型是unicode編碼的字符,即字符串。
原來類方法中的self.write(input_word[::-1])含義是,將原來的字符串倒置,并返回該數(shù)據(jù)到客戶端(如頁面)。
>>> a = "python,laoqi" >>> a[::-1] "iqoal,nohtyp" >>> b = [1,2,3,4] >>> b[::-1] [4, 3, 2, 1] >>> c = ("a","b","c") >>> c[::-1] ("c", "b", "a")
這是一種將序列類型對象倒置的一種方法。
總結一下:get()通過第二個參數(shù),獲得已經設置的顯示路徑中最后一個/后面的數(shù)據(jù),并且為unincode編碼的字符。
這種方式通過URL得到有關數(shù)據(jù),也就是說在URL中,只需要以http://localhost/aaa/bbb/ccc的形式來顯示路徑即可。看官是否注意到,有的網站是這么顯示的:http://localhost/aaa?name=Tom&&?age=25,這其實是兩種不同的規(guī)范也好、方法也罷的東西,前者更接近時下流行的REST規(guī)范,可能看官聽說過MVC吧,我聽不少的公司都強調網站要符合MVC規(guī)范,殊不知,更流行的是REST了。那么到底那個好呢?我的觀點:It depends.如果有興趣,請閱讀:《理解本真的REST架構風格》,對REST了解一二。
post()方法post()也是web上常用的方法,在本例中,該方法寫在了WrapHandler類中:
class WrapHandler(tornado.web.RequestHandler): def post(self): text = self.get_argument("text") width = self.get_argument("width", 40) self.write(textwrap.fill(text, width))
對應的Application類路徑:
(r"/wrap", WrapHandler)
但是,看官要注意,post()無法從URL中獲得數(shù)據(jù)。這是跟get()方法非常不一樣的。關于get和post之間的區(qū)別,請看官點擊《HTTP POST GET 本質區(qū)別詳解》閱讀。
客戶端的數(shù)據(jù)通過post方法發(fā)送到服務器,這個內在過程就是由所謂HTTP協(xié)議完成,不用去管它,因為現(xiàn)在我們只是研究應用層,不去深入網絡協(xié)議的層面??垂倏梢杂羞@樣的以為:怎么傳的數(shù)據(jù),但是我也可以不講,就算我也不會吧。不過,如果看官非要了解,請問google大神。
我要解釋的是,post()方法怎么接收到客戶端傳過來的數(shù)據(jù)。
因為post不能從URL中得到數(shù)據(jù),所以就不能用類似的方式在網頁的url中輸入要傳給它的數(shù)據(jù)了,只能這樣來測試:
qw@qw-Latitude-E4300:~$ curl http://localhost:8000/wrap -d text=I+love+Python+programming+and+I+am+writing+python+lessons+on+line I love Python programming and I am writing python lessons on line
請看官注意,URL依然是http://localhost:8000/wrap,后面的部分-d text=...,就是向這個地址對應的類WrapHandler中的post方法傳送相應的數(shù)據(jù),這個數(shù)據(jù)被tornado.web.RequestHandler中的get_arugment()方法獲得,也就是通過text=self.get_argument("text")得到傳過來的對象,并賦值給text。
這里需要提醒看官注意,self.get_argument("text")的參數(shù)中,是"text",就意味著,傳入數(shù)據(jù)的時候,需要用text這個變量,即必須寫成text=...。如果self.get_argument("word"),那么就應該是word=...方式傳入數(shù)據(jù)了。
看官此時是否已經曉得,get_argument()在post方法中,能夠獲得客戶端傳過來的數(shù)據(jù),當然是unicode編碼的。得到這個數(shù)據(jù)之后,就可以按照自己的需要進行操作了。
下一句width = self.get_argumen("width", 40)是要返回一個對象,這個對象約定變量為40,并將它用在下面的textwrap.fill(text, width)中。這里并沒有什么特別支出,也可以寫成width = 40,其實就是給textwrap.fill()提供參數(shù)罷了。關于textwrap模塊中的fill方法,可以用help命令來看看。
>>> import textwrap >>> help(textwrap.fill) Help on function fill in module textwrap: fill(text, width=70, **kwargs) Fill a single paragraph of text, returning a new string. Reformat the single paragraph in "text" to fit in lines of no more than "width" columns, and return a new string containing the entire wrapped paragraph. As with wrap(), tabs are expanded and other whitespace characters converted to space. See TextWrapper class for available keyword args to customize wrapping behaviour.簡要總結RequestHandler
RequestHandler就是請求處理程序的方法,從上面的流程中,可以簡要地初步地認為(深奧的東西還不少,這里只能是簡要地初步地膚淺地,隨著學習的深入會一點點深入地):
通過self.write()向客戶端返回數(shù)據(jù)
get()中,以一個參數(shù)從URL路徑末尾獲取數(shù)據(jù),特別提醒看官,這是在本講的例子中,get()方法中,用第二個參數(shù)獲得url數(shù)據(jù)。在上一講中,同樣是get()方法,用到了greeting = self.get_argument("greeting", "Hello"),于是不需要在get()中另外寫參數(shù),只需要通過"greeting"就可以得到URL中的數(shù)據(jù),不過這時候的url應該寫成http://localhost:8000/?greeting=PYTHON的樣式,于是字符傳"PYTHON"就能夠讓get()中的self.get_argument("greeting","Hello")獲得,如果沒有,就是"Hello"。
post()中,以sel.argument("text")的形式得到text為標簽提交的數(shù)據(jù)。
get和post是http中用的最多的方法啦。此外,Tornado也還支持其它的HTTP請求,如:PUT、DELETE、HEAD、OPTIONS。在具體編程的時候,如果看官用到,可以搜索,一般用的不多。
最后交代一句,get和post方法,由于一個是通過URL得到數(shù)據(jù),另外一個不是,所以,他們可以寫到同一個類中,彼此互不干擾。
還要說明,我在這部分參考了一本書的講授內容,特別是其中的代碼例子,這本書就是《Introduction to Tornado》
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉載請注明本文地址:http://www.ezyhdfw.cn/yun/37445.html
摘要:在年時,由網景公司的布蘭登艾克,在網景導航者瀏覽器上首次設計實作而成。為了取得技術優(yōu)勢,微軟推出了,推出,與同樣可在瀏覽器上運行。在表單中還要注意,有一個,表示的是要將表單的內容提交給路徑所對應的程序來處理。 But when he heard this, he said:Those who are well have no need of a physician, but th...
摘要:定制篩選器,對內容進行篩選重點。審查元素這是瀏覽器自帶的工具,提供抓包和檢查網頁源碼的功能,供使用者分析網頁。超時設置,如果服務器在指定秒數(shù)內沒有應答,拋出異常,用于避免無響應連接,整形或浮點數(shù)。返回連接狀態(tài),正常。 前言 python 3.6 !! 本爬蟲系列是面對有Python語法基礎的讀者寫的,如果你沒學過python,emmmm.....也沒關系,你或許能從每篇文章中學到一些...
摘要:的非阻塞單線程的特點在這個模塊中體現(xiàn)。還有一個模塊引入,是用完成的這兩句就顯示了所謂命令行解析模塊的用途了。表示可以接收來自的請求了。以上把一個簡單的剖析。 As he walked by the sea of Galilee, he saw two brothers, Simon, who is called Peter, and Andrew his brother, cas...
摘要:軟件開發(fā)者通常依據(jù)特定的框架實現(xiàn)更為復雜的商業(yè)運用和業(yè)務邏輯。所有,做開發(fā),要用一個框架。的性能是相當優(yōu)異的,因為它師徒解決一個被稱之為問題,就是處理大于或等于一萬的并發(fā)。 One does not live by bread alone,but by every word that comes from the mouth of God --(MATTHEW4:4) 不...
摘要:還有別的方法得到鍵值嗎有一般不是只有一個方法實現(xiàn)某個操作的。刪除鍵值對的方法有兩個,但是兩者有一點區(qū)別,根據(jù)刪除相應的鍵值對,并返回該值沒有返回值,如果刪除鍵不存在,返回錯誤用可以把合并到中。 dict的很多方法跟list有類似的地方,下面一一道來,并且會跟list做一個對比 嵌套 嵌套在list中也存在,就是元素是list,在dict中,也有類似的樣式: >>> a_list ...
閱讀 1419·2021-11-15 11:45
閱讀 3186·2021-09-27 13:36
閱讀 2920·2019-08-30 15:54
閱讀 1040·2019-08-29 12:38
閱讀 2973·2019-08-29 11:22
閱讀 3063·2019-08-26 13:52
閱讀 2096·2019-08-26 13:30
閱讀 652·2019-08-26 10:37