rfile.read()如何工作?

时间:2018-06-15 17:49:08

标签: python http post

我正在通过POST向我的服务器发送带有python脚本中字符串的文本文件:

fo = open('data'.txt','a')
fo.write("hi, this is my testing data")
fo.close()

with open('data.txt', 'rb') as f:
    r = requests.post("http://XXX.XX.X.X", data = {'data.txt':f})
    f.close()

在我的服务器处理程序脚本中接收和处理它,在网上找到了一个例子:

def do_POST(self):
    data = self.rfile.read(int(self.headers.getheader('Content-Length')))
    empty = [data]
    with open('processing.txt', 'wb') as file:
        for item in empty:
            file.write("%s\n" % item)

    file.close()
    self._set_headers()
    self.wfile.write("<html><body><h1>POST!</h1></body></html>")

我的问题是,如何:

self.rfile.read(int(self.headers.getheader('Content-Length')))

取我的数据长度(整数,字节数/字符数)并读取我的文件?我很困惑它如何知道我的数据包含什么。 HTTP幕后发生了什么?

输出data.txt=hi%2C+this+is+my+testing+data

到我的processing.txt,但我期待"hi this is my testing data"

我尝试但未能找到rfile.read()的确切文档,如果只是找到答案我的问题我会很感激,我可以删除这个问题。

1 个答案:

答案 0 :(得分:1)

您的客户端代码段从文件data.txt读取内容,并向服务器发出POST请求,其数据结构为键值对。在这种情况下发送到您的服务器的数据是一个键data.txt,相应的值是文件的内容。

您的服务器代码段读取整个 HTTP请求正文并将其转储到文件中。从客户端构建和发送的键值对的格式可由Python的内置库urlparse解码。

这是一个可行的解决方案:

def do_POST(self):
    length = int(self.headers.getheader('content-length'))
    field_data = self.rfile.read(length)
    fields = urlparse.parse_qs(field_data)

这段代码可耻地借鉴于:https://stackoverflow.com/a/31363982/705471

如果您想要提取文本文件的内容,请将以下代码行添加到上面的代码段中:

data_file = fields["data.txt"]

要详细了解如何针对HTTP编码此类信息,请参阅:https://en.wikipedia.org/wiki/Percent-encoding