WedX - журнал о программировании и компьютерных науках

ошибка python request.post при обновлении с 2.7 до 3.6

У меня есть этот код, который используется для отправки сообщения на шлюз aws api.

payload = {"thing-name": thing_name, "thing-name-sig": sig}
r = requests.post(api_gw, data=payload)

шлюз API возвращает: Метод завершен со статусом: 415

который для неизвестных СМИ

проблема началась, когда я обновил python с 2.7 до 3.6

код работал так:

payload = {"thing-name": thing_name, "thing-name-sig": sig}
r = requests.post(api_gw, data=json.dumps(payload))

который работает нормально, но как только я обновился до 3.6, компилятор python начал выдавать мне эту ошибку:

TypeError: объект типа «байты» не является сериализуемым JSON

поэтому я должен изменить его на data=payload, чтобы он прошел компилятор python, но тогда он не может пройти через шлюз API и возвращает известную медиа-ошибку со статусом 415.

поэтому есть два решения:

  1. либо каким-то образом я нахожу способ отправить формат строковых данных JSON в python 3.6 вместо сериализуемого объекта dict JSON. чего я не мог.

  2. каким-то образом сделать шлюз API, который служба aws может принимать сериализуемый объект dict JSON, отправляемый запросами python.post. который тоже не смог :(

любая помощь здесь.

Я пробовал это:

payload = {"thing-name": thing_name, "thing-name-sig": sig}
r = requests.post(api_gw, json=payload)

он вернул этот трекбэк:

Traceback (most recent call last):
  File "emon-device.py", line 154, in <module>
    r = requests.post(api_gw, json=payload)
  File "/home/ec2-user/.local/lib/python3.6/site-packages/requests/api.py", line                             116, in post
    return request('post', url, data=data, json=json, **kwargs)
  File "/home/ec2-user/.local/lib/python3.6/site-packages/requests/api.py", line                             60, in request
    return session.request(method=method, url=url, **kwargs)
  File "/home/ec2-user/.local/lib/python3.6/site-packages/requests/sessions.py",                             line 519, in request
    prep = self.prepare_request(req)
  File "/home/ec2-user/.local/lib/python3.6/site-packages/requests/sessions.py",                             line 462, in prepare_request
    hooks=merge_hooks(request.hooks, self.hooks),
  File "/home/ec2-user/.local/lib/python3.6/site-packages/requests/models.py", l                            ine 316, in prepare
    self.prepare_body(data, files, json)
  File "/home/ec2-user/.local/lib/python3.6/site-packages/requests/models.py", l                            ine 466, in prepare_body
    body = complexjson.dumps(json)
  File "/usr/lib64/python3.6/json/__init__.py", line 231, in dumps
    return _default_encoder.encode(obj)
  File "/usr/lib64/python3.6/json/encoder.py", line 199, in encode
    chunks = self.iterencode(o, _one_shot=True)
  File "/usr/lib64/python3.6/json/encoder.py", line 257, in iterencode
    return _iterencode(o, 0)
  File "/usr/lib64/python3.6/json/encoder.py", line 180, in default
    o.__class__.__name__)
TypeError: Object of type 'bytes' is not JSON serializable

  • каков тип thing_name и sig. пожалуйста, обновите тип этого. Он должен быть сериализуемым json, как строка или 16.12.2019
  • это строка ничего больше 16.12.2019
  • похоже, что в python 3 строка преобразуется в байты, поэтому перед передачей в полезную нагрузку снова преобразуйте ее в строку 16.12.2019

Ответы:


1

Комментарии, которые я получил здесь, были очень полезными. Сначала я использовал str(sig, "utf-8") для переменной sig. затем для всей полезной нагрузки str(payload) затем после этого я столкнулся с аналогичными ошибками в коде, перенесенном с python 2.7 на 3.6, например, запись в файл с запросом байтов, а не str, поэтому мне пришлось добавить encode() к некоторым строковым переменным, таким как strBytes.encode(), чтобы его можно было записать в файл. большое спасибо, код полностью работает в python 3.6.

16.12.2019

2

попробуй это:

payload = {"thing-name": thing_name, "thing-name-sig": sig}
r = requests.post(api_gw, json=payload)
16.12.2019
  • также дает эту ошибку: «TypeError: объект типа« байты »не является сериализуемым JSON» 16.12.2019
  • добавил к вопросу 16.12.2019
  • вы можете преобразовать thing-name и thing-name-sig в строку, используя thing_name.decode('utf-8') и sig.decode('utf-8') соответственно, и повторить попытку. 16.12.2019
  • он говорит, что str не имеет атрибута декодирования, но кодирование приняло его. но он также говорит, что не сериализуется 16.12.2019
  • Новые материалы

    Как проанализировать работу вашего классификатора?
    Не всегда просто знать, какие показатели использовать С развитием глубокого обучения все больше и больше людей учатся обучать свой первый классификатор. Но как только вы закончите..

    Работа с цепями Маркова, часть 4 (Машинное обучение)
    Нелинейные цепи Маркова с агрегатором и их приложения (arXiv) Автор : Бар Лайт Аннотация: Изучаются свойства подкласса случайных процессов, называемых дискретными нелинейными цепями Маркова..

    Crazy Laravel Livewire упростил мне создание электронной коммерции (панель администратора и API) [Часть 3]
    Как вы сегодня, ребята? В этой части мы создадим CRUD для данных о продукте. Думаю, в этой части я не буду слишком много делиться теорией, но чаще буду делиться своим кодом. Потому что..

    Использование машинного обучения и Python для классификации 1000 сезонов новичков MLB Hitter
    Чему может научиться машина, глядя на сезоны новичков 1000 игроков MLB? Это то, что исследует это приложение. В этом процессе мы будем использовать неконтролируемое обучение, чтобы..

    Учебные заметки: создание моего первого пакета Node.js
    Это мои обучающие заметки, когда я научился создавать свой самый первый пакет Node.js, распространяемый через npm. Оглавление Глоссарий I. Новый пакет 1.1 советы по инициализации..

    Забудьте о Matplotlib: улучшите визуализацию данных с помощью умопомрачительных функций Seaborn!
    Примечание. Эта запись в блоге предполагает базовое знакомство с Python и концепциями анализа данных. Привет, энтузиасты данных! Добро пожаловать в мой блог, где я расскажу о невероятных..

    ИИ в аэрокосмической отрасли
    Каждый полет – это шаг вперед к великой мечте. Чтобы это происходило в их собственном темпе, необходима команда астронавтов для погони за космосом и команда технического обслуживания..


    Для любых предложений по сайту: [email protected]