2015-08-31 47 views
10

我正在运行下面的代码来获取POST消息。如何获取文件(通过POST发送)以及如何响应HTTP状态代码200好吗?使用Python的BaseHTTPServer从POST请求获取文件

#!/usr/bin/env python 

import ssl 
import BaseHTTPServer, SimpleHTTPServer 
from BaseHTTPServer import BaseHTTPRequestHandler 

class HttpHandler(BaseHTTPRequestHandler): 
    def do_POST(self): 
     print "got POST message" 
     # how do I get the file here? 
     print self.request.FILES 


httpd = BaseHTTPServer.HTTPServer(('localhost', 4443), HttpHandler) 
httpd.socket = ssl.wrap_socket(httpd.socket, certfile='./server.pem', server_side=True) 
httpd.serve_forever()  



$curl -X POST -d @../some.file https://localhost:4443/resource --insecure 

AttributeError: 'SSLSocket' object has no attribute 'FILES'

回答

1

正是在

request.FILES 

字典一般可用

+0

在Django也许,但这不是Django。 –

8

BaseHTTPRequestHandler会处理第一行和HTTP请求,然后离开,其余由你的头。 你需要阅读使用BaseHTTPRequestHandler.rfile

您可以使用self.send_response(200)请求的其余部分给你指定的curl命令与200 OK

应对以下应该回答你的问题:

class HttpHandler(BaseHTTPRequestHandler): 
    def do_POST(self): 
     content_length = int(self.headers['Content-Length']) 
     file_content = self.rfile.read(content_length) 

     # Do what you wish with file_content 
     print file_content 

     # Respond with 200 OK 
     self.send_response(200) 

注通过在你的curl命令中使用-d @../some.file,你会说“这是一个ascii文件,哦,请删除换行符和回车符”,因此你所使用的文件和你得到的数据可能存在差异请求。您的curl命令不会模拟HTML表单文件 - 像发布请求一样上传。