如何通过Python';s BaseHTTPRequestHandler类?

如何通过Python';s BaseHTTPRequestHandler类?,python,basehttprequesthandler,Python,Basehttprequesthandler,新手问题。BaseHTTPRequestHandler和正在接收数据 我一直在使用BaseHTTPRequestHandler接收作为数据传递到URI的JSON字符串。我现在需要接收JSON字符串和ascii文件。我怎么知道我同时收到了JSON数据和一个单独的平面文件?如何访问文件中的数据 如果我收到多个文件怎么办 顺便说一句,我刚刚通过从Postman调用我的URI运行了一个测试&请参见以下标题: headers: Host: localhost:6081 Content-Type: app

新手问题。BaseHTTPRequestHandler和正在接收数据

我一直在使用BaseHTTPRequestHandler接收作为数据传递到URI的JSON字符串。我现在需要接收JSON字符串和ascii文件。我怎么知道我同时收到了JSON数据和一个单独的平面文件?如何访问文件中的数据

如果我收到多个文件怎么办

顺便说一句,我刚刚通过从Postman调用我的URI运行了一个测试&请参见以下标题:

headers: Host: localhost:6081

Content-Type: application/x-www-form-urlencoded

User-Agent: python-requests/2.2.1 CPython/3.4.0 Linux/3.13.0-35-generic

Accept: */*

Accept-Encoding: gzip, deflate, compress

Content-Length: 403
谢谢大家!


Ben

答案在CGI库中。请参阅以下StackOverflow post:。那篇文章的第二个答案对我们非常有用

以下是一些测试代码,您可能会发现这些代码对于打印出幕后发生的事情非常有用,特别是当您试图在一篇文章中接收多个文件时:

        print("command: " + self.command + "\npath: " + self.path + "\nrequest_version: " \
            + self.request_version + "\nheaders: " + str(self.headers))
        form = cgi.FieldStorage(
            fp=self.rfile,
            headers=self.headers,
            environ={'REQUEST_METHOD': 'POST',
                     'CONTENT_TYPE': self.headers['Content-Type'],
                     })
        print("\nform:", str(form))
        print("\nform['file'].filename:", form['file'].filename)
        filename = form['file'].filename
        data = form['file'].file.read()
        open("/tmp/%s" % filename, "wb").write(data)
        print('\ndata:', data)

根据这些标题判断,您的客户机正在发送文件。有关文件上载工作原理的一般概述,请参阅。(在您的情况下,因为您使用的是JSON而不是www表单urlencoded,所以细节会略有不同,但它仍然是一个MIME多部分消息。)因此,在您担心服务器端之前,您需要解决这个问题。无论如何,
BaseHTTPRequestHandler
,尤其是2.x版本,使这个问题变得非常棘手。IIRC,“正确”的方法是手动使用
电子邮件
包中的MIME解析内容来处理正文,但是有一种黑客方法可以做到这一点,它是用子类中的
MessageClass
class属性替换
email.message.message
,并使用
headers
属性,就好像它是信封一样。实际上,挖掘一些旧代码,您需要在
email.message.message
周围传递一个包装器,该包装器具有类似于
mimetools.message
的构造函数。基本上,它需要使用
fp
参数并使用它将数据提供给它的超类。希望这足以让你开始吗?@abarnert谢谢你的帮助。我们正在使用Python3+,经过一些实验,我们发现cgi库在这方面有所帮助。我将把这篇文章作为我问题的答案。