处理curl文件上载请求时,Python HTTP服务器中出现KeyError

处理curl文件上载请求时,Python HTTP服务器中出现KeyError,python,curl,file-upload,keyerror,Python,Curl,File Upload,Keyerror,我有一个Python中的HTTP服务器,它处理来自curl的文件上传请求 class HTTPRequestHandler(BaseHTTPRequestHandler): def do_POST(self): if re.search('/api/v1/addphoto', self.path): form_data=cgi.FieldStorage() file_data=form

我有一个Python中的HTTP服务器,它处理来自curl的文件上传请求

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()
现在我必须使用curl发送请求,命令是

curl -i -F name=photofile -F filedata=@01.jpeg 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'
这里有什么问题?

在字典中找不到键时引发

我对cgi.FieldStorage不太熟悉,但我想你应该会得到一本字典,而且钥匙
'photofile'
不见了。 只需打印整个表单数据并查看其内容

您可以使用
form_data.get('photofile','')
获取默认值并避免异常

顺便说一句,对于写入文件,您可以使用
语句作为上下文管理器

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

好的,我从中找到原因和方法

原因是“您不能像那样将CGI代码嵌入服务器代码中。CGIHTTPServer(以及一般的CGI)的全部要点是,它在指定的目录中执行单独的脚本并返回输出。因为您重写了do_POST方法,所以从未调用解析表单数据的代码。”(实际上,我打印的表单数据是空的-“
None,None,[]
”)

要修复它,请使用传入的参数()


您将
None
re.search()
的结果进行比较是愚蠢的。如果re.search(…)不是None:
或者如果re.search(…):
确定,已编辑。我是Python新手,代码来自web教程。对错误有何想法?
 form = cgi.FieldStorage(
        fp=self.rfile, 
        headers=self.headers,
        environ={'REQUEST_METHOD':'POST',
                 'CONTENT_TYPE':self.headers['Content-Type'],
                 })