成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

[零基礎(chǔ)學(xué)python]探析get和post方法

AaronYuan / 761人閱讀

摘要:特別提醒,看官不要自宮,因?yàn)楸窘坛滩皇潜傩皠ψV,也不是葵花寶典,撰寫本課程的人更是生理健全者。直到目前,科學(xué)上尚未有證實(shí)或證偽自宮和寫程序之間是否存在某種因果關(guān)系。和是中用的最多的方法啦。

  

"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ā)網(wǎng)站的過程中,post和get是常見常用的兩個(gè)方法,關(guān)于這兩個(gè)方法的詳細(xì)解釋,請(qǐng)列為閱讀這篇文章:《HTTP POST GET 本質(zhì)區(qū)別詳解》,這篇文章前面已經(jīng)推薦閱讀了,可以這么說,如果看官?zèng)]有搞明白get和post,也可以寫出web程序,但是,只要遇到“但是”,就說明另有乾坤,但是如果看官要對(duì)這方面有深入理解,并且將來(lái)能上一個(gè)檔次,是必須了解的。這就如同你要練習(xí)辟邪劍譜中的劍法,不自宮,也可以練,但是無(wú)法突破某個(gè)極限,岳不群也不傻,最終他要成為超一流,就不惜按照劍譜中開篇所說“欲練神功,揮刀自宮”,“神功”是需要“自宮”為前提,否則,練出來(lái)的不是“神功”,無(wú)法問鼎江湖。

特別提醒,看官不要自宮,因?yàn)楸窘坛滩皇潜傩皠ψV,也不是葵花寶典,撰寫本課程的人更是生理健全者。若看官自宮了,責(zé)任自負(fù),與本作者無(wú)關(guān)。直到目前,科學(xué)上尚未有證實(shí)或證偽自宮和寫程序之間是否存在某種因果關(guān)系。所以提醒看官慎重行事。

還是扯回來(lái),看下面的代碼先:

#!/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()

這段代碼跟上一講的代碼相比,基本結(jié)構(gòu)是一樣的,但是在程序主體中,這次寫了兩個(gè)類ReverseHandlerWrapHandler,這兩個(gè)類中分別有兩個(gè)方法get()和post()。在tornado.web.Application()實(shí)例化中,handlers的參數(shù)值分別設(shè)置了不同路徑對(duì)應(yīng)這兩個(gè)類。

其它方面跟上一講的代碼一樣。

把上述代碼的文件,存到某個(gè)目錄下,我給他取名為:request_url.py,名字看官也可以自己定。然后進(jìn)入該目錄,運(yùn)行:python request_url.py,就將這個(gè)tornado框架的網(wǎng)站以端口8000發(fā)布了。

打開網(wǎng)頁(yè),在瀏覽器中輸入:http://localhost:8000/reverse/qiwsirpython

界面上輸出什么結(jié)果?

還可以在命令終端,用下面方式調(diào)試,跟在網(wǎng)頁(yè)上輸出是等同效果。

qw@qw-Latitude-E4300:~$ curl http://localhost:8000/reverse/qiwsirpython
nohtypriswiq

再看另外一個(gè)路徑,看官運(yùn)行的是否是下面的結(jié)果呢?

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

調(diào)試通過,就開始分析其中的奧妙。

get()

在ReverseHandler類中,定義了這個(gè)方法。

class ReverseHandler(tornado.web.RequestHandler):
    def get(self, input_word):
        self.write(input_word[::-1])

這個(gè)get()方法要和下面Application實(shí)例化中的路徑:

(r"/reverse/(w+)", ReverseHandler),

關(guān)聯(lián)起來(lái)看。

首先看路徑設(shè)置:r"/reverse/(w+)",這個(gè)路徑的意思就是可以在瀏覽器的url中輸入:http://localhost:8000/reverse/ffffdd,這個(gè)樣子的地址,注意路徑中的(w+),是正則表達(dá)式,在reverse/的后面可以輸入一個(gè)或者多個(gè)包括下劃線的任何單詞字符。也就是ffffdd可以更換為任何其它字母或者下劃線,一個(gè)或者多個(gè)均可以。

在URL中輸入的這個(gè)地址,就被ReverseHandler類中的get()方法接收,這就是(r"/reverse/(w+)", ReverseHandler)之含義了。那么,ReverseHandler中的get()方法如何接收url中傳遞過來(lái)的信息呢?

前文已經(jīng)說過,在def get(self, input_word)中,self參數(shù)在類實(shí)例化后對(duì)應(yīng)的是tornado.web.RequestHandler,另外一個(gè)參數(shù)input_word用來(lái)接收來(lái)自u(píng)rl的信息,但是它只接收所設(shè)置的路徑尾部數(shù)據(jù),也就是路徑r"/reverse/(w+)"中reverse后面的第一個(gè)分割符號(hào)“/”之后的內(nèi)容,都被input_word接收過來(lái),即正則表達(dá)式的內(nèi)容。

input_word接收過來(lái)的對(duì)象,是什么類型呢?猜測(cè)一下,從前面程序的運(yùn)行結(jié)果看,肯定是某種序列類型的對(duì)象。具體是哪種呢?可以實(shí)驗(yàn)。

將get方法修改為:

def get(self, input_word):
    input_type = type(input_word)
    self.write("%s"%input_type)

再運(yùn)行程序,打印出來(lái)的是:

qw@qw-Latitude-E4300:~$ curl http://localhost:8000/reverse/qiwei

這說明,get()方法通過URL接收到的數(shù)據(jù)類型是unicode編碼的字符,即字符串。

原來(lái)類方法中的self.write(input_word[::-1])含義是,將原來(lái)的字符串倒置,并返回該數(shù)據(jù)到客戶端(如頁(yè)面)。

>>> 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")

這是一種將序列類型對(duì)象倒置的一種方法。

總結(jié)一下:get()通過第二個(gè)參數(shù),獲得已經(jīng)設(shè)置的顯示路徑中最后一個(gè)/后面的數(shù)據(jù),并且為unincode編碼的字符。

這種方式通過URL得到有關(guān)數(shù)據(jù),也就是說在URL中,只需要以http://localhost/aaa/bbb/ccc的形式來(lái)顯示路徑即可??垂偈欠褡⒁獾剑械木W(wǎng)站是這么顯示的:http://localhost/aaa?name=Tom&&?age=25,這其實(shí)是兩種不同的規(guī)范也好、方法也罷的東西,前者更接近時(shí)下流行的REST規(guī)范,可能看官聽說過MVC吧,我聽不少的公司都強(qiáng)調(diào)網(wǎng)站要符合MVC規(guī)范,殊不知,更流行的是REST了。那么到底那個(gè)好呢?我的觀點(diǎn):It depends.如果有興趣,請(qǐng)閱讀:《理解本真的REST架構(gòu)風(fēng)格》,對(duì)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))

對(duì)應(yīng)的Application類路徑:

(r"/wrap", WrapHandler)

但是,看官要注意,post()無(wú)法從URL中獲得數(shù)據(jù)。這是跟get()方法非常不一樣的。關(guān)于get和post之間的區(qū)別,請(qǐng)看官點(diǎn)擊《HTTP POST GET 本質(zhì)區(qū)別詳解》閱讀。

客戶端的數(shù)據(jù)通過post方法發(fā)送到服務(wù)器,這個(gè)內(nèi)在過程就是由所謂HTTP協(xié)議完成,不用去管它,因?yàn)楝F(xiàn)在我們只是研究應(yīng)用層,不去深入網(wǎng)絡(luò)協(xié)議的層面??垂倏梢杂羞@樣的以為:怎么傳的數(shù)據(jù),但是我也可以不講,就算我也不會(huì)吧。不過,如果看官非要了解,請(qǐng)問google大神。

我要解釋的是,post()方法怎么接收到客戶端傳過來(lái)的數(shù)據(jù)。

因?yàn)閜ost不能從URL中得到數(shù)據(jù),所以就不能用類似的方式在網(wǎng)頁(yè)的url中輸入要傳給它的數(shù)據(jù)了,只能這樣來(lái)測(cè)試:

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

請(qǐng)看官注意,URL依然是http://localhost:8000/wrap,后面的部分-d text=...,就是向這個(gè)地址對(duì)應(yīng)的類WrapHandler中的post方法傳送相應(yīng)的數(shù)據(jù),這個(gè)數(shù)據(jù)被tornado.web.RequestHandler中的get_arugment()方法獲得,也就是通過text=self.get_argument("text")得到傳過來(lái)的對(duì)象,并賦值給text。

這里需要提醒看官注意,self.get_argument("text")的參數(shù)中,是"text",就意味著,傳入數(shù)據(jù)的時(shí)候,需要用text這個(gè)變量,即必須寫成text=...。如果self.get_argument("word"),那么就應(yīng)該是word=...方式傳入數(shù)據(jù)了。

看官此時(shí)是否已經(jīng)曉得,get_argument()在post方法中,能夠獲得客戶端傳過來(lái)的數(shù)據(jù),當(dāng)然是unicode編碼的。得到這個(gè)數(shù)據(jù)之后,就可以按照自己的需要進(jìn)行操作了。

下一句width = self.get_argumen("width", 40)是要返回一個(gè)對(duì)象,這個(gè)對(duì)象約定變量為40,并將它用在下面的textwrap.fill(text, width)中。這里并沒有什么特別支出,也可以寫成width = 40,其實(shí)就是給textwrap.fill()提供參數(shù)罷了。關(guān)于textwrap模塊中的fill方法,可以用help命令來(lái)看看。

>>> 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.
簡(jiǎn)要總結(jié)RequestHandler

RequestHandler就是請(qǐng)求處理程序的方法,從上面的流程中,可以簡(jiǎn)要地初步地認(rèn)為(深?yuàn)W的東西還不少,這里只能是簡(jiǎn)要地初步地膚淺地,隨著學(xué)習(xí)的深入會(huì)一點(diǎn)點(diǎn)深入地):

通過self.write()向客戶端返回?cái)?shù)據(jù)

get()中,以一個(gè)參數(shù)從URL路徑末尾獲取數(shù)據(jù),特別提醒看官,這是在本講的例子中,get()方法中,用第二個(gè)參數(shù)獲得url數(shù)據(jù)。在上一講中,同樣是get()方法,用到了greeting = self.get_argument("greeting", "Hello"),于是不需要在get()中另外寫參數(shù),只需要通過"greeting"就可以得到URL中的數(shù)據(jù),不過這時(shí)候的url應(yīng)該寫成http://localhost:8000/?greeting=PYTHON的樣式,于是字符傳"PYTHON"就能夠讓get()中的self.get_argument("greeting","Hello")獲得,如果沒有,就是"Hello"。

post()中,以sel.argument("text")的形式得到text為標(biāo)簽提交的數(shù)據(jù)。

get和post是http中用的最多的方法啦。此外,Tornado也還支持其它的HTTP請(qǐng)求,如:PUT、DELETE、HEAD、OPTIONS。在具體編程的時(shí)候,如果看官用到,可以搜索,一般用的不多。

最后交代一句,get和post方法,由于一個(gè)是通過URL得到數(shù)據(jù),另外一個(gè)不是,所以,他們可以寫到同一個(gè)類中,彼此互不干擾。

還要說明,我在這部分參考了一本書的講授內(nèi)容,特別是其中的代碼例子,這本書就是《Introduction to Tornado》


本博客在編寫過程中,難免有錯(cuò)誤,幸虧有廣大網(wǎng)友大神們指出。但是由于各種原因,我在www.itdiffer.com更新比較及時(shí),因?yàn)槭峭泄茉趃ithub上的。在這里一般不進(jìn)行更新修改。請(qǐng)諒解。

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/37445.html

相關(guān)文章

  • [基礎(chǔ)學(xué)python]使用tornado表單模板

    摘要:在年時(shí),由網(wǎng)景公司的布蘭登艾克,在網(wǎng)景導(dǎo)航者瀏覽器上首次設(shè)計(jì)實(shí)作而成。為了取得技術(shù)優(yōu)勢(shì),微軟推出了,推出,與同樣可在瀏覽器上運(yùn)行。在表單中還要注意,有一個(gè),表示的是要將表單的內(nèi)容提交給路徑所對(duì)應(yīng)的程序來(lái)處理。 But when he heard this, he said:Those who are well have no need of a physician, but th...

    Berwin 評(píng)論0 收藏0
  • Python開始爬蟲()——爬蟲思路&requests模塊使用

    摘要:定制篩選器,對(duì)內(nèi)容進(jìn)行篩選重點(diǎn)。審查元素這是瀏覽器自帶的工具,提供抓包和檢查網(wǎng)頁(yè)源碼的功能,供使用者分析網(wǎng)頁(yè)。超時(shí)設(shè)置,如果服務(wù)器在指定秒數(shù)內(nèi)沒有應(yīng)答,拋出異常,用于避免無(wú)響應(yīng)連接,整形或浮點(diǎn)數(shù)。返回連接狀態(tài),正常。 前言 python 3.6 ??! 本爬蟲系列是面對(duì)有Python語(yǔ)法基礎(chǔ)的讀者寫的,如果你沒學(xué)過python,emmmm.....也沒關(guān)系,你或許能從每篇文章中學(xué)到一些...

    YanceyOfficial 評(píng)論0 收藏0
  • [基礎(chǔ)學(xué)python]Hello,第一個(gè)網(wǎng)頁(yè)分析

    摘要:的非阻塞單線程的特點(diǎn)在這個(gè)模塊中體現(xiàn)。還有一個(gè)模塊引入,是用完成的這兩句就顯示了所謂命令行解析模塊的用途了。表示可以接收來(lái)自的請(qǐng)求了。以上把一個(gè)簡(jiǎn)單的剖析。 As he walked by the sea of Galilee, he saw two brothers, Simon, who is called Peter, and Andrew his brother, cas...

    Steve_Wang_ 評(píng)論0 收藏0
  • [基礎(chǔ)學(xué)python]python開發(fā)框架

    摘要:軟件開發(fā)者通常依據(jù)特定的框架實(shí)現(xiàn)更為復(fù)雜的商業(yè)運(yùn)用和業(yè)務(wù)邏輯。所有,做開發(fā),要用一個(gè)框架。的性能是相當(dāng)優(yōu)異的,因?yàn)樗鼛熗浇鉀Q一個(gè)被稱之為問題,就是處理大于或等于一萬(wàn)的并發(fā)。 One does not live by bread alone,but by every word that comes from the mouth of God --(MATTHEW4:4) 不...

    lucas 評(píng)論0 收藏0
  • [基礎(chǔ)學(xué)Python]dict()的操作方法

    摘要:還有別的方法得到鍵值嗎有一般不是只有一個(gè)方法實(shí)現(xiàn)某個(gè)操作的。刪除鍵值對(duì)的方法有兩個(gè),但是兩者有一點(diǎn)區(qū)別,根據(jù)刪除相應(yīng)的鍵值對(duì),并返回該值沒有返回值,如果刪除鍵不存在,返回錯(cuò)誤用可以把合并到中。 dict的很多方法跟list有類似的地方,下面一一道來(lái),并且會(huì)跟list做一個(gè)對(duì)比 嵌套 嵌套在list中也存在,就是元素是list,在dict中,也有類似的樣式: >>> a_list ...

    vpants 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<