requests에서bytearray 데이터를 발송할 수 없습니다

requests에서bytearray 데이터를 발송할 수 없습니다

import requests
body = b"abc"
body = bytearray(body)
r = requests.post('https://example.com', data=body)
# r = requests.post('https://example.com', data=memoryview(body))
print(r.status_code)
TypeError                                 Traceback (most recent call last)
~/.pyenv/versions/3.7.0/Python.framework/Versions/3.7/lib/python3.7/http/client.py in send(self, data)
    976         try:
--> 977             self.sock.sendall(data)
    978         except TypeError:

~/.pyenv/versions/3.7.0/Python.framework/Versions/3.7/lib/python3.7/site-packages/urllib3/contrib/pyopenssl.py in sendall(self, data)
    330         while total_sent < len(data):
--> 331             sent = self._send_until_done(data[total_sent:total_sent + SSL_WRITE_BLOCKSIZE])
    332             total_sent += sent

~/.pyenv/versions/3.7.0/Python.framework/Versions/3.7/lib/python3.7/site-packages/urllib3/contrib/pyopenssl.py in _send_until_done(self, data)
    319             try:
--> 320                 return self.connection.send(data)
    321             except OpenSSL.SSL.WantWriteError:

~/.pyenv/versions/3.7.0/Python.framework/Versions/3.7/lib/python3.7/site-packages/OpenSSL/SSL.py in send(self, buf, flags)
   1731         if not isinstance(buf, bytes):
-> 1732             raise TypeError("data must be a memoryview, buffer or byte string")
   1733         if len(buf) > 2147483647:

TypeError: data must be a memoryview, buffer or byte string

정상적인 요청이지만 요청의 내용은 bytearray일 수 없고, 어떤 컴퓨터는 bytearray형 데이터를 제출할 수 있다.
인터넷에 올라온 게시물들은 모두 pyopenssl의 문제라고 하는데, 끝까지 무슨 문제인지 모르겠지만.
이상설에 의하면 제출한 내용은 memoryview, buffer or byte string이어야 하며 제출한 내용을 ``memoryview`로 변경해야 합니다.

memoryview


가변 바이트 시퀀스 python3 에서 str 기본값은 unicode 인코딩이며, bytearray 를 통해서만 바이트에 접근할 수 있습니다.strbytearray 슬라이스 작업을 수행하면 새로운 슬라이스strbytearray 데이터가 생성되고 memoryview 이후에는 데이터를 복제하지 않습니다.
In [72]: stra = bytearray(b'abcde')

In [73]: strb = stra[:3]

In [74]: stra
Out[74]: bytearray(b'abcde')

In [75]: strb
Out[75]: bytearray(b'abc')
In [91]: a = bytearray(b'aaaa')	#  

In [92]: b = memoryview(a)	#  

In [93]: b.readonly	#  
Out[93]: False

In [94]: c = b[:2]	#   bytearray

In [95]: c
Out[95]: <memory at 0x125fca048>

In [97]: c[:2] = b'ww'	#  b 

In [98]: c.tobytes()
Out[98]: b'ww'

In [99]: b.tobytes()
Out[99]: b'wwaa'
 
In [100]: a = b'aaaa'	

In [101]: b = memoryview(a)	

In [102]: b.readonly	#  
Out[102]: True
memoryview를 사용하면 큰 str로 단락 분석을 할 때 대량의 절편 조작을 피할 수 있다.

좋은 웹페이지 즐겨찾기