Flask架構返回GET請求的參數為什麼會導致500 Internal Server Error?

來源:互聯網
上載者:User

回複內容:

首先明確這幾個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):


要不這麼改改試試?
  • 相關文章

    聯繫我們

    該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

    如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

    A Free Trial That Lets You Build Big!

    Start building with 50+ products and up to 12 months usage for Elastic Compute Service

    • Sales Support

      1 on 1 presale consultation

    • After-Sales Support

      24/7 Technical Support 6 Free Tickets per Quarter Faster Response

    • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.