如何访问 MultipartDecoder 中的字段名称

jol*_*roi 7 multipartform-data python-requests

我正在使用request-toolbelt解码通过 HTTP POST 请求提交的表单字段。我成功实例化了此处MultipartDecoder描述的类似内容。现在我想通过发送请求时指定的名称来访问表单字段。

我能够得到这样的字段的名称

from requests_toolbelt.multipart import decoder
multipart_string = b"--ce560532019a77d83195f9e9873e16a1\r\nContent-Disposition: form-data; name=\"author\"\r\n\r\nJohn Smith\r\n--ce560532019a77d83195f9e9873e16a1\r\nContent-Disposition: form-data; name=\"file\"; filename=\"example2.txt\"\r\nContent-Type: text/plain\r\nExpires: 0\r\n\r\nHello World\r\n--ce560532019a77d83195f9e9873e16a1--\r\n"
content_type = "multipart/form-data; boundary=ce560532019a77d83195f9e9873e16a1"
decoder = decoder.MultipartDecoder(multipart_string, content_type)
field_name = decoder.parts[0].headers[b'Content-Disposition'].decode().split(';')[1].split('=')[1]
Run Code Online (Sandbox Code Playgroud)

但这似乎是完全错误的。访问表单字段名称的常用方法是什么?

小智 4

我在下面使用它来解码该方法的结果:

    lst = []
for part in decoder.MultipartDecoder(postdata.encode('utf-8'), content_type_header).parts:
    disposition = part.headers[b'Content-Disposition']
    params = {}
    for dispPart in str(disposition).split(';'):
        kv = dispPart.split('=', 2)
        params[str(kv[0]).strip()] = str(kv[1]).strip('\"\'\t \r\n') if len(kv)>1 else str(kv[0]).strip()
    type = part.headers[b'Content-Type'] if b'Content-Type' in part.headers else None
    lst.append({'content': part.content, "type": type, "params": params})
Run Code Online (Sandbox Code Playgroud)

我认为因为它是一个标准的 Mime 标头,所以有一些函数可以执行相同的操作,但代码也更少。