복붙노트

[PYTHON] Python 요청 : 단일 요청으로 JSON 및 파일 게시

PYTHON

Python 요청 : 단일 요청으로 JSON 및 파일 게시

파일에 대한 세부 정보가있는 JSON 문자열과 함께 파일을 업로드하려면 API 호출을해야합니다.

파이썬 요청 lib이 사용하려면 노력하고 있습니다.

import requests

info = {
    'var1' : 'this',
    'var2'  : 'that',
}

data = json.dumps({
    'token' : auth_token,
    'info'  : info,
})

headers = {'Content-type': 'multipart/form-data'}

files = {'document': open('file_name.pdf', 'rb')}

r = requests.post(url, files=files, data=data, headers=headers)

그러면 다음 오류가 발생합니다.

    raise ValueError("Data must not be a string.")
 ValueError: Data must not be a string

요청에서 '파일'을 제거하면 작동합니다. 요청에서 '데이터'를 제거하면 작동합니다. JSON으로 데이터를 인코딩하지 않으면 작동합니다.

이러한 이유로 JSON 데이터와 파일을 같은 요청으로 보내는 것과 관련된 오류라고 생각합니다.

이 아이디어를 얻는 방법에 대한 아이디어가 있습니까?

해결법

  1. ==============================

    1.json을 사용하여 인코딩하지 마십시오.

    json을 사용하여 인코딩하지 마십시오.

    import requests
    
    info = {
        'var1' : 'this',
        'var2'  : 'that',
    }
    
    data = {
        'token' : auth_token,
        'info'  : info,
    }
    
    headers = {'Content-type': 'multipart/form-data'}
    
    files = {'document': open('file_name.pdf', 'rb')}
    
    r = requests.post(url, files=files, data=data, headers=headers)
    

    이것은 다른 양식 데이터 섹션이 될 것이므로 반드시 원하는 것은 아닐 수도 있습니다.

  2. ==============================

    2.이 스레드를 참조하십시오. 다중 파트 POST 요청의 일부로 JSON을 보내는 방법

    이 스레드를 참조하십시오. 다중 파트 POST 요청의 일부로 JSON을 보내는 방법

    Content-type 헤더를 직접 설정하지 마십시오. 생성하려면 pyrequests로 남겨 둡니다.

    def send_request():
    payload = {"param_1": "value_1", "param_2": "value_2"}
    files = {
         'json': (None, json.dumps(payload), 'application/json'),
         'file': (os.path.basename(file), open(file, 'rb'), 'application/octet-stream')
    }
    
    r = requests.post(url, files=files)
    print(r.content)
    
  3. ==============================

    3.나는 다중 파트로 인코딩 된 파일에서 데이터와 파일을 보낼 수 있다고 생각하지 않는다. 따라서 데이터를 "파일"로 만들 필요가있다.

    나는 다중 파트로 인코딩 된 파일에서 데이터와 파일을 보낼 수 있다고 생각하지 않는다. 따라서 데이터를 "파일"로 만들 필요가있다.

    files = {
        'data' : data,
        'document': open('file_name.pdf', 'rb')
    }
    
    r = requests.post(url, files=files, headers=headers)
    
  4. ==============================

    4.무엇보다 :

    무엇보다 :

    files = {
        'document': open('file_name.pdf', 'rb')
    }
    

    스크립트가있는 디렉토리에 파일이있는 경우에만 작동합니다.

    다른 디렉토리의 파일을 추가하려면 다음을 수행해야합니다.

    files = {
        'document': open(os.path.join(dir_path, 'file_name.pdf'), 'rb')
    }
    

    여기서 dir_path는 'file_name.pdf'파일이있는 디렉토리입니다.

    하지만 여러 개의 PDF를 보내려면 어떻게해야합니까?

    사용자 정의 함수를 만들어 필요한 파일 목록을 반환 할 수 있습니다 (확장자가 .pdf 인 사용자 만 가능). 또한 하위 디렉토리에있는 파일을 포함합니다 (재귀 적으로 파일 검색).

    def prepare_pdfs():
        return sorted([os.path.join(root, filename) for root, dirnames, filenames in os.walk(dir_path) for filename in filenames if filename.endswith('.pdf')])
    

    그런 다음 호출 할 수 있습니다.

    my_data = prepare_pdfs()
    

    그리고 간단한 루프로 :

    for file in my_data:
    
        pdf = open(file, 'rb')
    
        files = {
            'document': pdf
        }
    
        r = requests.post(url, files=files, ...)
    
  5. from https://stackoverflow.com/questions/19439961/python-requests-post-json-and-file-in-single-request by cc-by-sa and MIT license