2017-10-31 11 views
2

だから私は、最近のPython 3.6とDjango 1.11に移行し、私のJsonResponseコードはこのように見えた:のpython 3.6 JsonResponse問題

return JsonResponse({'status': '1'}) 

それがうまく働いたが、移行後、私はこのエラーを取得開始しました:

TypeError: Object of type 'bytes' is not JSON serializable

JsonResponseに渡されたデータのタイプを印刷した後、私はPython 3.6がこれをdictからbyteに変更したことを認識しました。 私はdictを渡していることを確認するコードを変更しました。

私はまだ、このすべてを試した後、同じエラーを取得:

data = dict([('status', 0)]) 
    print(data) 
    print(type(data)) 
    # print(type(json.dumps(data))) 
    # data = {"status": '0'} 
    # data = json.dumps(data) 
    # json.dumps(data.decode("utf-8")) 
    #response = json.JSONEncoder().encode({"status": 0}) 
    #JsonResponse(data, safe=False) 
    # response = json.dumps(data) 
    print(JsonResponse(data, safe=False)) 
    return JsonResponse(data, safe=False) 

プリント:json.dumpsオプション付き

{'status': 0} 
    <class 'dict'> 
    <JsonResponse status_code=200, "application/json"> 

yが代わりに

AttributeError: 'str' object has no attribute 'get'

このエラーが出ますどんな助けでも大いに感謝されます

トレースバック

Traceback (most recent call last): 
    File "/Users/andresvillavicencio/bancompara.mx/lib/python3.6/site-packages/django/core/handlers/base.py", line 131, in get_response 
    response = middleware_method(request, response) 
    File "/Users/andresvillavicencio/bancompara.mx/lib/python3.6/site-packages/django/contrib/sessions/middleware.py", line 58, in process_response 
request.session.save() 
    File "/Users/andresvillavicencio/bancompara.mx/lib/python3.6/site-packages/django/contrib/sessions/backends/db.py", line 81, in save 
return self.create() 
    File "/Users/andresvillavicencio/bancompara.mx/lib/python3.6/site-packages/django/contrib/sessions/backends/db.py", line 54, in create 
self.save(must_create=True) 
    File "/Users/andresvillavicencio/bancompara.mx/lib/python3.6/site-packages/django/contrib/sessions/backends/db.py", line 83, in save 
obj = self.create_model_instance(data) 
    File "/Users/andresvillavicencio/bancompara.mx/lib/python3.6/site-packages/django/contrib/sessions/backends/db.py", line 69, in create_model_instance 
session_data=self.encode(data), 
    File "/Users/andresvillavicencio/bancompara.mx/lib/python3.6/site-packages/django/contrib/sessions/backends/base.py", line 98, in encode 
serialized = self.serializer().dumps(session_dict) 
    File "/Users/andresvillavicencio/bancompara.mx/lib/python3.6/site-packages/django/core/signing.py", line 93, in dumps 
return json.dumps(obj, separators=(',', ':')).encode('latin-1') 
    File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/json/__init__.py", line 238, in dumps 
**kw).encode(obj) 
    File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/json/encoder.py", line 199, in encode 
chunks = self.iterencode(o, _one_shot=True) 
    File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/json/encoder.py", line 257, in iterencode 
return _iterencode(o, 0) 
    File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/json/encoder.py", line 180, in default 
o.__class__.__name__) 
    TypeError: Object of type 'bytes' is not JSON serializable 
+0

私が追加完全なトレースバック、私は私が関数を使用する前にオブジェクトのすべてのタイプを印刷し、dictと文字列は正常であるというエラーを受け取るべきではないことを知っています。それはなぜそんなに怒っている@Alasdair –

+0

それはPython 3.5で動作しますか?私は問題がjsonシリアライザにのみ関連していると仮定します。マインドパイ2.7? – deathangel908

+3

DjangoがDjangoセッションを保存しようとしたときにエラーが発生していることをトレースバックが示しています。問題は 'return JsonResponse({'status': '1'})'ではありません。あなたは前のビューで 'request.session ['my_key'] = b'bytes''のようなことをする必要があります。 – Alasdair

答えて

1

問題がreturn JsonResponse({'status': '1'})ではありません。

DjangoがDjangoセッションを保存しようとしたときにエラーが発生していることを示すトレースバックが表示されます。

ビューでこのような何かをやっている必要があります

request.session['my_key'] = b'bytes' 

ことたとえば、あなたはbytesオブジェクトをデコード(またはその代わりに文字列を使用)する必要があります:

request.session['my_key'] = b'bytes'.decode('utf-8')