[英]flask application: trying to jsonify a dictionary
背景信息
我正在嘗試編寫我的第一個 Flask/python REST API。 到目前為止,我有一個 GET 連接到 redis 數據庫並嘗試將字典轉換為 json ......然后返回這些結果。
問題
當我嘗試在我的 dict 對象上調用 jsonify 時,它失敗並出現以下錯誤:
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 行看到的那樣,以查看 keys() 的樣子。 這是我在日志文件中看到的:
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
我找到了這個問題/答案: How to parse python b' string contains 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 並返回給被調用者。
你有沒有試過像這樣先導入json
import json
然后做
json.dumps(myDict)
然后在需要時再次加載它。
json.loads(response.text)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.