приложение фляги: попытка jsonify словарь - PullRequest
0 голосов
/ 04 января 2019

Справочная информация

Я пытаюсь написать свой первый REST API фляги / python. До сих пор у меня есть GET, который подключается к базе данных Redis и пытается преобразовать словарь в JSON ... и затем вернуть эти результаты.

Задача

Когда я пытаюсь вызвать jsonify для моего объекта dict, происходит сбой со следующей ошибкой:

Traceback (most recent call last):
  File "/usr/lib/python3.6/site-packages/flask/app.py", line 1982, in wsgi_app
    response = self.full_dispatch_request()
  File "/usr/lib/python3.6/site-packages/flask/app.py", line 1614, in full_dispatch_request
    rv = self.handle_user_exception(e)
  File "/usr/lib/python3.6/site-packages/flask/app.py", line 1517, in handle_user_exception
    reraise(exc_type, exc_value, tb)
  File "/usr/lib/python3.6/site-packages/flask/_compat.py", line 33, in reraise
    raise value
  File "/usr/lib/python3.6/site-packages/flask/app.py", line 1612, in full_dispatch_request
    rv = self.dispatch_request()
  File "/usr/lib/python3.6/site-packages/flask/app.py", line 1598, in dispatch_request
    return self.view_functions[rule.endpoint](**req.view_args)
  File "/var/www/localhost/htdocs/widgets/widgets.py", line 51, in get_profile
    return jsonify(res_dict)
  File "/usr/lib/python3.6/site-packages/flask/json.py", line 263, in jsonify
    (dumps(data, indent=indent, separators=separators), '\n'),
  File "/usr/lib/python3.6/site-packages/flask/json.py", line 123, in dumps
    rv = _json.dumps(obj, **kwargs)
  File "/usr/lib/python3.6/json/__init__.py", line 238, in dumps
    **kw).encode(obj)
  File "/usr/lib/python3.6/json/encoder.py", line 201, in encode
    chunks = list(chunks)
  File "/usr/lib/python3.6/json/encoder.py", line 430, in _iterencode
    yield from _iterencode_dict(o, _current_indent_level)
  File "/usr/lib/python3.6/json/encoder.py", line 376, in _iterencode_dict
    raise TypeError("key " + repr(key) + " is not a string")
TypeError: key b'email1' is not a string

Код выглядит так:

 20 def get_db_profile(mailbox):
 21     """ connects to redis and queries for profile """
 22     try:
 23         my_redis = redis.Redis(connection_pool=POOL)
 24         response = my_redis.hgetall(55555)
 25         logging.info(response.keys())
 26         logging.info(response.items())
 27         #response = '123455555'
 28         return response
 29     except Exception as ex:
 30         return "Error:", ex

47 @application.route("/widgets/api/<int:mailbox>", methods=['GET'])
48 def get_profile(mailbox):
49     res_dict = get_db_profile(mailbox)
50 #    return application.response_class(jsonify(res_dict), content_type='application/json')
51     return jsonify(res_dict)
52 #    return '12345'
53

Я добавил некоторые записи, как вы можете видеть в строке 25, чтобы посмотреть, как выглядят ключи (). Вот что я вижу в файле журнала:

lab-1:/var/www/localhost/htdocs/widgets# cat /tmp/widgets.log
root - INFO - dict_keys([b'email1', b'email2'])

Данные REDIS

Вот как я создал данные redis:

127.0.0.1:6379[5]> hmset 55555 email1 johndoe@hotmail.com email2 jd@yahoo.com
OK
127.0.0.1:6379[5]>

Вопросы

Должен ли я быть в состоянии преобразовать из объекта dict в строку json? Что такое «b» в файлах журнала?

lab-1:/var/www/localhost/htdocs/widgets# cat /tmp/widgets.log
root - INFO - dict_keys([b'email1', b'email2'])
root - INFO - dict_items([(b'email1', b'johndoe@hotmail.com'), (b'email2', b'jd@yahoo.com')])

Как мне отправить правильный ответ JSON?

РЕДАКТИРОВАТЬ 1

Я нашел этот вопрос / ответ: Как разобрать строку python b ', содержащую dict и исходя из этого я попытался изменить свою логику, чтобы она выглядела так:

47 @application.route("/pvmailprofiles/api/<int:mailbox>", methods=['GET'])
48 def get_profile(mailbox):
49     res_dict = get_db_profile(mailbox)
50 #    return application.response_class(jsonify(res_dict), content_type='application/json')
51     #return jsonify(res_dict)
52     return res_dict[b'email1']
53 #    return '12345'
54

Строка 52 - вы можете видеть, что в качестве теста я жестко закодировал 'b' и затем имя ключа. И это работает - он возвращает конкретный адрес электронной почты. Но мне нужно найти способ «просто» конвертировать все в json и вернуться в callee.

1 Ответ

0 голосов
/ 04 января 2019

Пытались ли вы сначала импортировать json следующим образом

import json

, а затем выполнить

json.dumps(myDict)

, а затем снова загрузить его, если необходимо.

json.loads(response.text)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...