2014-09-02 22 views
0

我有在Python它處理從捲曲KeyError異常在Python HTTP服務器處理捲曲文件上傳時請

class HTTPRequestHandler(BaseHTTPRequestHandler): 
    def do_POST(self): 
      if re.search('/api/v1/addphoto', self.path): 
        form_data=cgi.FieldStorage() 
        file_data=form_data['photofile'].value 
        # Next I will save this file 
        # fp =open('some/file','wb') 
        # fp.write(file_data) 
        # fp.close() 

文件上傳請求,現在我必須使用捲曲發送請求的HTTP服務器,命令

curl -i -F name=photofile -F [email protected] http://server_ip:port/api/v1/addphoto 

但是服務器報告錯誤

File "./apiserver.py", line 21, in do_POST 
    file_data=form_data['photofile'].value 
File "/usr/lib/python2.7/cgi.py", line 541, in __getitem__ 
    raise KeyError, key 
KeyError: 'photofile' 

這裏有什麼問題嗎?

+0

你None'的'比較re.search的'結果()'是愚蠢的。將其更改爲'如果re.search(...)不是None:'或plain'if re.search(...):' – msvalkon 2014-09-02 06:42:03

+0

確定,已編輯。我是Python新手,代碼來自Web教程。有關錯誤的任何想法? – mrmoment 2014-09-02 06:53:51

回答

0

好吧,我找到原因,並從here如何做到這一點。

原因是「你不能像這樣在服務器代碼中嵌入CGI代碼。CGIHTTPServer(和一般的CGI)的全部意義在於它在指定的目錄中執行單獨的腳本並返回輸出結果因爲您已經重寫了do_POST方法,解析表單數據的代碼從未被稱爲。「 (其實我打印form_data,它是空的 - 「None, None, []」)。

並修復它,使用參數(details)通過

form = cgi.FieldStorage(
     fp=self.rfile, 
     headers=self.headers, 
     environ={'REQUEST_METHOD':'POST', 
       'CONTENT_TYPE':self.headers['Content-Type'], 
       }) 
1

KeyError當詞典中找不到鍵時引發。

我不熟悉cgi.FieldStorage,但我想你應該得到一本字典,並且鍵'photofile'缺失。 只需打印整個form_data並查看它的內容。

您可以使用form_data.get('photofile', '')來獲取默認值並避免該異常。

順便說一句,對於寫入文件,您可以使用with語句作爲上下文管理器。

with open('some/file','wb') as fp: 
    fp.write(file_data)