TypeError: publier des données doit être octets ou un objet iterable octets. Il ne peut pas être str
Je viens de mettre à jour de python 3.1 python 3.2 (au format HD) et un de mes scripts cessé de travailler. Il me donne l'erreur dans le titre.
Je voudrais corriger moi-même mais je ne sais même pas ce qu'est un objet iterable octets est lol. J'ai essayé typecasting octets(de données) mais cela ne fonctionne pas non plus. TypeError: argument de chaîne sans un encodage
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)
Il se bloque à la dernière ligne.
Travaille en 3.1, mais pas 3.2
Vous devez vous connecter pour publier un commentaire.
Vous n'avez fondamentalement correcte en essayant de convertir la chaîne en octets, mais vous l'avez fait dans le mauvais sens. Python n'a pas typecasting (donc ce que vous avez fait n'était pas typecasting).
La façon de le faire est d'encoder les données de texte dans les octets de données, ce que vous faites avec l'encodage de la fonction:
Ce "encodage" devrait être dépend. Vous devriez probablement utiliser 'ascii' ici. Si vous avez des caractères non ASCII, alors vous devez utiliser un autre codage, généralement 'utf8', mais alors vous devez également indiquer à la réception de serveur web qu'il est UTF-8. Il pourrait également ne pas vouloir UTF8, mais ensuite, vous avez à me le demander, et il devient compliqué. 🙂
data
dans l'exemple ci-dessus.binary_data
est fournie lorsque vous avez besoin de convertir des données.@Enders, je sais que c'est une vieille question, mais j'aimerais expliquer un peu plus les choses pour quelqu'un qui lutte contre ce problème.
C'est précisément avec cette ligne de code ici:
Que vous rencontrez des problèmes, que vous êtes en train de coder les données: les valeurs (urlencode).
Si vous vous référez à la urllib.analyser la documentation faites défiler vers le bas pour trouver ce urlencode n': https://docs.python.org/3/library/urllib.parse.html <~ vous verrez que vous encodez votre user/pass dans une chaîne de données:
Peut-être ce que vous essayez de faire ici est de faire une sorte de cryptage de votre nom d'utilisateur/mot de passe, mais je ne pense pas vraiment que ce soit la bonne façon. Si c'est le cas, alors vous avez probablement besoin pour s'assurer que l'extrémité de réception (la destination de votre url) de savoir que vous êtes l'encodage de votre user/pass avec cette.
Plus up-to-date approche consiste à utiliser la puissance des Demandes de la bibliothèque. Ils ont compatibilité avec de très commun protocoles d'authentification: http://docs.python-requests.org/en/master/user/authentication/
Dans ce cas, je ferais quelque chose comme ceci: