python 3.x - built - TypeError: los datos POST deben ser bytes o un iterable de bytes. No puede ser str
round python 3 (2)
Acabo de actualizar de Python 3.1 a Python 3.2 (HD formateado) y uno de mis scripts dejó de funcionar. Me da el error en el título.
Me gustaría arreglarlo yo mismo, pero ni siquiera sé qué iterable de bytes es jajaja. Intenté encasillar bytes (datos) pero tampoco funcionó. TypeError: argumento de cadena sin una codificación
url = "http://example.com/index.php?app=core&module=global§ion=login&do=process"
values = {"username" : USERNAME,
"password" : PASSWORD}
data = urllib.parse.urlencode(values)
req = urllib.request.Request(url, data)
urllib.request.urlopen(req)
Se bloquea en la última línea.
Funciona en 3.1, pero no en 3.2
@Enders, sé que esta es una vieja pregunta, pero me gustaría explicar algunas cosas más para alguien que pelea con este tema.
Es específicamente con esta línea de código aquí:
data = urllib.parse.urlencode(values)
Que tiene problemas, ya que está tratando de codificar los datos: values (urlencode).
Si se refiere a la documentación de urllib.parse, vaya a la parte inferior para encontrar lo que hace urlencode: https://docs.python.org/3/library/urllib.parse.html <~ verá que está tratando de codificar su usuario / pasar a una cadena de datos:
Convierta un objeto de mapeo o una secuencia de tuplas de dos elementos, que pueden contener objetos str o bytes, en una cadena de texto ASCII codificada en porcentaje. Si la cadena resultante se va a utilizar como un dato para la operación POST con la función urlopen (), entonces debería codificarse en bytes, de lo contrario resultaría en un TypeError.
Quizás lo que intenta hacer aquí es hacer algún tipo de encriptación de su usuario / contraseña, pero realmente no creo que este sea el camino correcto. Si es así, entonces probablemente deba asegurarse de que el extremo receptor (el destino de su url) sepa que está codificando su usuario / pase con esto.
Un enfoque más actualizado es usar la poderosa biblioteca de Solicitudes. Tienen compatibilidad con protocolos de autenticación muy comunes: http://docs.python-requests.org/en/master/user/authentication/
En este caso, haría algo como esto:
requests.get(url, auth=(''user'', ''pass''))
Básicamente, corrigió al tratar de convertir la cadena en bytes, pero lo hizo de forma incorrecta. Python no tiene encasillamiento (así que lo que hiciste no fue encasillar).
La forma de hacerlo es codificar los datos de texto en datos de bytes, lo que haces con la función de codificación:
binary_data = data.encode(''encoding'')
Lo que debe ser ''codificación'' depende. Probablemente deberías usar ''ascii'' aquí. Si tiene caracteres que no son ASCII, entonces necesita usar otra codificación, típicamente ''utf8'', pero luego también debe decirle al servidor web receptor que es UTF-8. Es posible que tampoco quiera UTF8, pero debe preguntarlo, y se está complicando. :-)