python get argument_Python-Web框架-get_argument方法
Python-Web框架-get_argument方法
目錄概覽
1.使用get_argument獲取url query參數(shù)
2.為何get_argument不區(qū)分POST與GET?
3.get_argument返回unicode數(shù)據(jù)類型的問(wèn)題
1.使用get_argument獲取url query參數(shù)
Tornado的每個(gè)請(qǐng)求處理程序,我們叫做handler,handler里可以自定義自己的處理程序,其實(shí)也就是重寫方法,如post,get,get_current_user,send_error等等,這里我們只講get和post的自定義。
我們都知道,在Tornado里,獲得用戶的輸入,都是一個(gè)get_argument搞定,似乎很順理成章:
def post(self):
nowamagic = self.get_argument('nowamagic')
self.write( nowamagic )
import urlparse
urlparse.urlparse('http://www.nowamagic.net/academy/detail/13321002?page=1#comment')
ParseResult(scheme='http', netloc='www.nowamagic.net', path='/academy/detail/13321002', params='', query='page=1', fragment='comment')
url由scheme(協(xié)議),netloc(主機(jī)),path(路徑),params(最后路徑的參數(shù)),query(查詢字段),fragment(錨)組成。
下面我們要獲取URL里的GET參數(shù),也就是獲取url query中的參數(shù),怎么辦呢?
對(duì)于單一的值,在get和post中調(diào)用self.get_argument("name", "default")。
對(duì)于多選的值,調(diào)用self.get_arguments("name")即可。
get_argument方法可以設(shè)置默認(rèn)值,也可以設(shè)置是否刪除兩端的空格。
源碼聲明如下:
get_argument(self, name, default=_ARG_DEFAULT, strip=True)
get_arguments(self, name, strip=True)
2.為何get_argument不區(qū)分POST與GET?
Tornado的get_argument有點(diǎn)類似PHP的 $ _REQUEST,是不區(qū)分GET與POST的。而且Tornado好像是沒(méi)有PHP里的$ _GET,$ _POST這樣的區(qū)分獲取get數(shù)據(jù)與post數(shù)據(jù)的方法。為什么會(huì)這樣么?
URL的query string還是x-www-form-encode的數(shù)據(jù)可以按key/value方式來(lái)解析,其實(shí)是一種約定俗成的規(guī)矩。甚至表單POST的編碼格式都是和GET的query string編碼是一樣的。CGI的實(shí)現(xiàn)中也只用了一套代碼來(lái)處理。就說(shuō)兩種方法實(shí)際上在做同一件事情。
而同時(shí)提供key/value的query string和x-www-form-encode的POST數(shù)據(jù),也不違反任何協(xié)議和標(biāo)準(zhǔn)。
其次,通常當(dāng)你要提交key/value數(shù)據(jù)的時(shí)候,目的是一致的。POST只不過(guò)允許你提交更多的數(shù)據(jù)而已。為什么要混用兩套東西呢?
tornado做的,只不過(guò)是提供接口提高最常見(jiàn)場(chǎng)景的編碼效率。如果應(yīng)用場(chǎng)景比較特殊,可以自行解析request.body, request.url,獲取原始的數(shù)據(jù)進(jìn)行處理。
從安全角度來(lái)說(shuō),在Tornado中,一個(gè)RequestHandler中,處理GET和POST是兩個(gè)不同的函數(shù),這是一個(gè)很關(guān)鍵的因素。
對(duì)于某些Framework(比如Zend Framework),Model不區(qū)分GET和POST方法,換句話說(shuō),一個(gè)URL Patten不管是通過(guò)POST還是GET來(lái)訪問(wèn),處理函數(shù)都是同一個(gè),所以Zend的getParam方法就向程序員提供了數(shù)據(jù)來(lái)源的選擇。而且這對(duì)于Zend Framework程序的安全也是至關(guān)重要。
對(duì)于GET請(qǐng)求,沒(méi)什么好說(shuō)的,因?yàn)镚ET請(qǐng)求的數(shù)據(jù)來(lái)源只有query string一條路,所以指定數(shù)據(jù)來(lái)源是沒(méi)有意義的。
對(duì)于POST請(qǐng)求,XSRF攻擊者的確可以將本來(lái)應(yīng)該寫在x-www-form-encode里的數(shù)據(jù)轉(zhuǎn)移到query string里,但是這么做毫無(wú)意義。因?yàn)檫@樣做會(huì)使請(qǐng)求變?yōu)間et函數(shù)來(lái)處理。攻擊自然會(huì)失敗。
所以,Tornado的這種做法是有道理的,而不是簡(jiǎn)單的為了提高編碼效率。畢竟,編碼效率的提高也必須建立在保證安全的基礎(chǔ)上。
3. get_argument返回unicode數(shù)據(jù)類型的問(wèn)題
在 Tornado 里,self.get_argument返回的數(shù)據(jù)類型為unicode:
chars = self.get_argument('chars')
self.write( str(type(chars)) )
# 輸出
#
get_argument在獲取數(shù)據(jù)的時(shí)候,會(huì)進(jìn)行decode("utf-8")操作,因?yàn)間et_argument最終調(diào)用了tornado.escape下面的to_unicode方法,也就是argument會(huì)通過(guò)decode("utf-8")來(lái)轉(zhuǎn)成unicode:
def to_unicode(value):
"""
Converts a string argument to a unicode string.
If the argument is already a unicode string or None, it is returned
unchanged. Otherwise it must be a byte string and is decoded as utf8.
"""
if isinstance(value, _TO_UNICODE_TYPES):
return value
assert isinstance(value, bytes)
return value.decode("utf-8")
# to_unicode was previously named _unicode not because it was private,
# but to avoid conflicts with the built-in unicode() function/type
_unicode = to_unicode
get_argument獲取數(shù)據(jù)之后一般需要先使用u.encode('utf-8')轉(zhuǎn)換成string類型后才能使用。
如果用get_argument無(wú)法獲取數(shù)據(jù),可以用更加原始的方法通過(guò)self.request.arguments獲取GET或者POST的所有參數(shù)字典,這個(gè)字典是未經(jīng)過(guò)decode處理的原生參數(shù),每個(gè)參數(shù)都是字典里面的一項(xiàng),主要每個(gè)參數(shù)對(duì)應(yīng)的項(xiàng)都是一個(gè)列表。
總結(jié)
以上是生活随笔為你收集整理的python get argument_Python-Web框架-get_argument方法的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: css border 虚线间距_一小时快
- 下一篇: 乌鲁木齐新铝德源红郡是哪个开发商?