回複內容:
首先明確這幾個Python的規則,然後再做推斷。
1. data是傳入的查詢參數,按照現代各類程式設計語言的玩法,是要先轉換成unicode字串的,這樣做國際化和本地化才比較方便。所以data的類型就是unicode,type(data)返回的結果就是unicode。這個unicode是Python的內建類型,同時也是一個函數。
2. type(data)==unicode之後,在Python的控制台直接列印,會獲得 "" 這是因為Python控制台在列印時會自動調用對象的 .__str__() 方法,來獲得一個可以顯示的字串,這也是Python的方便之處。你可以手工在Python控制台裡執行 str(unicode) 會得到 "" 。
3. Web架構是如何工作的?常用的PythonWeb架構在請求處理函數所需的傳回值類型是str,這樣就可以直接發送給用戶端了。如果需要定製回應標頭,可以用架構內建的Response對象。但無論如何,這些架構的底層基本都是直接實現WSGI介面,一個Python通用的Web伺服器介面。而如上的start_response() 其實就是Flask在檢測到函數傳回值為一個函數時,就把他當成了一個WSGI函數來處理。傳入了WSGI函數的兩個參數,一個dict類型的環境,一個function類型start_response函數。即實際調用的是unicode(environ,start_response)。
4. unicode函數的用法是將一個字串轉換成unicode對象。第一個參數是字串,第二個參數是編碼字元集。比如
>>> print(unicode('你好','utf-8'))
你好
所以,你的程式所遇到的問題是這樣的。data是個unicode類型,也是unicode函數。Flask裡作為傳回值時,Flask檢測到這是個函數,於是當成了一個WSGI application來處理,傳入了environ和start_response兩個參數。而unicode函數實際接受的兩個參數是字串和字元集,所以遇到了參數錯誤。
你如果需要在Flask知道data的類型,可以用 str(type(data)) 。這樣將輸出轉換成可顯示的字串,就能看到了。在 Flask 中,根據 method handle 返回的結果,首先調用 make_response
def make_response(self, rv): ... if not isinstance(rv, self.response_class): if isinstance(rv, (text_type, bytes, bytearray)): rv = self.response_class(rv, headers=headers, status=status) headers = status = None # rv是 method handle返回的結果,在k神代碼中是 else: rv = self.response_class.force_type(rv, request.environ)
因為type(data)返回的是一個type類型,而函數不允許return一個type類型。改成這樣:
return repr(type(data))可能是機制不一樣,flask的視圖返回字串之類,就算你返回數字也是不行的,最近我也是在弄web那塊,剛折騰的差不多,而且你那個公眾號好像是個人未認證訂閱號吧,開發人員模式沒有自訂菜單的,也就是缺少一個直接的web入口,還得通過訊息發連結,挺麻煩的,限制很多,另外去stackoverflow搜尋會更好點,基本都能找到答案app.debug=True
可以看到詳細錯誤按規定這個要返回字串,那你就要返回字串,返回別的能用不說明任何問題,也不代表以後的版本仍然能用,當你返回不是字串的時候就已經是未定義行為了,只是在web.py裡面這個未定義行為剛好是可以用的而已你可以開啟debug模式。來自 webpy 源碼 webpy/utils.py
def safestr(obj, encoding='utf-8'): r""" Converts any given object to utf-8 encoded string. >>> safestr('hello') 'hello' >>> safestr(u'\u1234') '\xe1\x88\xb4' >>> safestr(2) '2' """ if isinstance(obj, unicode): return obj.encode(encoding) elif isinstance(obj, str): return obj elif hasattr(obj, 'next'): # iterator return itertools.imap(safestr, obj) else: return str(obj)
我寫的flask應用中,methods是寫在app.route裝飾器裡面的。
類似這樣
@app.route('/', methods=['GET', 'POST'])
def func(args):
要不這麼改改試試?