2016-10-09 7 views
0

私は小さなAPIプロジェクトのためにファルコンを試しています。残念なことに、私はjson構文解析の作業に取り掛かっていて、ドキュメンテーションの例のコードは機能しません。ファルコン解析jsonエラー

私はスタックとGoogleで見つけた多くのことを試みましたが、変更はありませんでした。 私は

import json 
import falcon 

class JSON_Middleware(object): 
    def process_request(self, req, resp): 
     raw_json = json.loads(req.stream.read().decode('UTF-8')) 
     """Exception: AttributeError: 'str' object has no attribute 'read'""" 

     raw_json = json.loads(req.stream.read(), 'UTF-8') 
     """Exception: TypeError: the JSON object must be str, not 'bytes'""" 

     raw_json = json.loads(req.stream, 'UTF-8') 
     """TypeError: the JSON object must be str, not 'Body'""" 

私はあきらめの途中だけど、誰かが私を伝えることができるならば、これが起こって、どのようにファルコンでJSONを解析するために、私は希望される理由を、以下のエラーになり、次のコードを試してみました非常に感謝しています。

おかげ

環境: OSXシエラ のPython 3.5.2 ファルコン、他方は、コードの他の部分が所定の位置にある場合、あなたのコードは動作するはずピップ

答えて

1

から最新バージョンです。簡単なテスト(ファイル名app.py):あなたはreq.stream.read().encode('utf-8')ようなものでread()によって返されたバイトにencode()を呼び出す必要がありgunicorn app
$ curl -XPOST 'localhost:8000' -d '{"Hello":"wold"}'

+0

ご回答いただきありがとうございます。この例は、私が持っていたものとほとんど同じですが、コピーペーストの魔女は "TypeError:JSONオブジェクトはstrでなければなりません。" VMのUbuntuでテストされ、うまくいきました。これはおかしい。再インストールしようとしましたが、助けにはなりませんでした。アイデア? :-) – Audunfr

+0

@ Audunfrこの答えが正しいと分かったら、それを受け入れてください。 – anekix

1

:と

import falcon 
import json 

class JSON_Middleware(object): 
    def process_request(self, req, resp): 
     raw_json = json.loads(req.stream.read()) 
     print raw_json 

class Test: 
    def on_post(self,req,resp): 
     pass 

app = application = falcon.API(middleware=JSON_Middleware()) 
t = Test() 
app.add_route('/test',t) 

実行。

このように、バイトはjson.loads()によって期待通りにstrに変換されます。

この退屈でエラーが発生しやすいencode/decodeとbytes/str stuff(PythonではPythonとは異なります)を気にしない別の方法は、jsonの代わりにsimplejsonを使用することです。 APIと互換性があるので、唯一の変更はimport jsonimport simplejson as jsonに置き換えることです。

さらに、本体の読み取りはjson.load(req.bounded_stream)で行うことができます。これはjson.loads(req.bounded_stream.read().encode('utf-8'))よりはるかに短く読みやすくなります。

これで、このようにして標準のjsonモジュールを使用しなくなりました。