[PYTHON] Python 요청 : 단일 요청으로 JSON 및 파일 게시
PYTHONPython 요청 : 단일 요청으로 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.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.이 스레드를 참조하십시오. 다중 파트 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.나는 다중 파트로 인코딩 된 파일에서 데이터와 파일을 보낼 수 있다고 생각하지 않는다. 따라서 데이터를 "파일"로 만들 필요가있다.
나는 다중 파트로 인코딩 된 파일에서 데이터와 파일을 보낼 수 있다고 생각하지 않는다. 따라서 데이터를 "파일"로 만들 필요가있다.
files = { 'data' : data, 'document': open('file_name.pdf', 'rb') } r = requests.post(url, files=files, headers=headers)
-
==============================
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, ...)
from https://stackoverflow.com/questions/19439961/python-requests-post-json-and-file-in-single-request by cc-by-sa and MIT license
'PYTHON' 카테고리의 다른 글
[PYTHON] 플라스크를 사용하여 선택 태그에서 가치 얻기 (0) | 2018.11.07 |
---|---|
[PYTHON] OpenCV가 anaconda가 설치된 Linux에서 Python과 제대로 작동하지 않습니다. cv2.imshow ()가 구현되지 않았다는 에러를 받는다. (0) | 2018.11.07 |
[PYTHON] 파이썬에서 코드 블록을 주석 처리하는 방법 [duplicate] (0) | 2018.11.07 |
[PYTHON] Excel Python API (0) | 2018.11.07 |
[PYTHON] 파이썬 요청은 로컬 URL에서 파일을 가져옵니다. (0) | 2018.11.07 |