Python服务器cgi.FieldStorage解析multipart / form

所以我一直在Python中编写一个简单的Web服务器,现在我正在尝试处理多部分/表单数据POST请求。 我已经可以处理application / x-www-form-urlencoded POST请求,但相同的代码不适用于multipart。 如果看起来我误解了任何东西,请给我打电话,即使它很小。 此外,如果你们有任何建议使我的代码更好,请让我知道以及:)谢谢!

当请求进入时,我首先解析它,然后将其分割成一个包含请求正文的标题和字符串的字典。 然后我使用它们构造一个FieldStorage表单,然后我可以像字典一样处理数据:

requestInfo = ''
while requestInfo[-4:] != 'rnrn':
    requestInfo += conn.recv(1)

requestSplit = requestInfo.split('rn')[0].split(' ')
requestType = requestSplit[0]

url = urlparse.urlparse(requestSplit[1])
path = url[2] # Grab Path

if requestType == "POST":
    headers, body = parse_post(conn, requestInfo)

    print "!!!Request!!! " + requestInfo
    print "!!!Body!!! " + body 
    form = cgi.FieldStorage(headers = headers, fp = StringIO(body), environ = {'REQUEST_METHOD':'POST'}, keep_blank_values=1)

这是我的parse_post方法:

def parse_post(conn, headers_string):
    headers = {}
    headers_list = headers_string.split('rn')

    for i in range(1,len(headers_list)-2):
        header = headers_list[i].split(': ', 1)
        headers[header[0]] = header[1]

    content_length = int(headers['Content-Length'])

    content = conn.recv(content_length)

    # Parse Content differently if it's a multipart request??

    return headers, content

因此,对于x-www-form-urlencoded POST请求,我可以将FieldStorage格式视为字典,如果我打电话,例如:

firstname = args['firstname'].value
print firstname

它会工作。 但是,如果我发送多部分POST请求,它最终不会打印任何内容。

这是x-www-form-urlencoded请求的主体:firstname = TEST&lastname = rwar

这是多部分请求的主体:--070f6a3146974d399d97c85dcf93ed44内容处理:表单数据; NAME = “姓氏”; 文件名=“姓氏”

rwar --070f6a3146974d399d97c85dcf93ed44内容处理:表单数据; NAME = “姓名”; 文件名=“姓名”

测试--070f6a3146974d399d97c85dcf93ed44--

所以,这里是一个问题,如果手动解析parse_post中的数据的正文,如果它是一个多部分请求?

或者是否有我需要/可以用来解析多部分物体的方法?

或者我完全错了吗?

再次感谢,我知道这是一个长时间的阅读,但我想确保我的问题是全面的


所以我解决了我的问题,但以一种非常冒险的方式。

结束手动解析请求的主体,这里是我写的代码:

if("multipart/form-data" in headers["Content-Type"]):
    data_list = []
    content_list = content.split("rnrn")
    for i in range(len(content_list) - 1):
        data_list.append("")

    data_list[0] += content_list[0].split("name=")[1].split(";")[0].replace('"','') + "="

    for i,c in enumerate(content_list[1:-1]):
        key = c.split("name=")[1].split(";")[0].replace('"','')
        data_list[i+1] += key + "="
        value = c.split("rn")
        data_list[i] += value[0]

    data_list[-1] += content_list[-1].split("rn")[0]

    content = "&".join(data_list)

如果有人仍然可以解决我的问题,而无需手动解析身体,请让我知道!


有一个流式表单数据项目,它提供了一个Python解析器来解析multipart/form-data编码multipart/form-data 。 它旨在允许以块的形式解析数据,但由于没有强制执行块大小,所以您可以立即传递整个输入,并且它应该可以完成这项工作。 它应该可以通过pip install streaming_form_data进行安装。

以下是源代码 - https://github.com/siddhantgoel/streaming-form-data

文档 - https://streaming-form-data.readthedocs.io/en/latest/

免责声明:我是作者。 当然,如果遇到错误,请创建一个问题。 :)

链接地址: http://www.djcxy.com/p/22177.html

上一篇: Python server cgi.FieldStorage parsing multipart/form

下一篇: POST variable if doing a POST using multipart/form