2014-09-02 18 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)