web.input()和web.data() 遇到特殊字符

使用web.py的時候,web.input()和web.data() 均可以接收用戶從瀏覽器端輸入的參數。python

web.input()方法返回一個包含從url(GET方法)或http header(POST方法,即表單POST)獲取的變量的web.storage對象(相似字典).舉個例子,若是你訪問頁面http://example.com/test?id=10,在Python後臺你想取得 id=10 ,那麼經過web.input()那就是小菜一碟:web

class SomePage:
    def GET(self):
        user_data = web.input()
        return "<h1>" + user_data.id + "</h1>"

web.data()獲取的是http請求包中的實體正文,函數返回值類型是字符串。因爲GET請求包中沒有實體正文,因此GET請求包是不能使用web.data()函數的,只有POST請求包才能夠使用web.data()函數,返回的是一個字符串。舉個例子,經過一個form提交了一個username和password,web.date接收到的數據是這樣的。瀏覽器

class RequestHandler():
    def POST():
        data = web.data() # 經過這個方法能夠取到數據

print data
>>'username=jay&password=123456'

 

特殊字符的處理函數

當用戶輸入了test@test.com,使用web.input 接收到的就是test@test.com,而使用web.data接收到的就是test%40test.com,若是混用這兩種方式,並且不作額外的編碼和解碼,就會出現信息不一致的狀況。編碼

我作項目的時候,註冊的時候接收用戶的輸入,使用web.input 接收用戶的輸入,登錄的時候使用web.data接收用戶的輸入。結果是:只要用戶的密碼中包含了特殊字符,就會出現沒法登錄的狀況。url

解決方案是:將註冊環節接收用戶輸入的方式也改成web.data,一方面註冊和登錄的接收方式一致了,一方面因爲web.data方式會對特殊字符進行轉碼,避免了大部分潛在的問題!orm

 

補充:web.input http://webpy.org/cookbook/input.zh-cn
           web.data 對象

相關文章
相關標籤/搜索