2017-11-29 16 views
0

現在、Python(Flask)を使用してREST APIを作成する方法を理解しようとしています。これは、ユーザーが指定したURLをブラウズすることでJSON形式のデータを取得できます。 :5000/DPM。私は、次のPythonスクリプトを書きましたが、のようなエラーを受け取る:JSON用データ型PythonのREST API

File "mysql.py", line 23, in api.add_resource(DPM, '/DPM') File "C:\Program Files\Anaconda3\lib\site-packages\flask_restful__init__.py", line 404, in add_resource self._register_view(self.app, resource, *urls, **kwargs) File "C:\Program Files\Anaconda3\lib\site-packages\flask_restful__init__.py", line 444, in _register_view resource_func = self.output(resource.as_view(endpoint, *resource_class_args, AttributeError: type object 'DPM' has no attribute 'as_view'

from flask import Flask 
from flask_restful import Resource, Api 
from sqlalchemy import create_engine 
import json 

app = Flask(__name__) 
api = Api(app) 

class DPM: 
    def __init__(self, time, month): 
     self.time = time 
     self.month = month 
energy = DPM('[12.18]','11') 

def jdefault(o): 
    return o.__dict__ 
print(json.dumps(energy, default=jdefault, indent=4)) 

api.add_resource(DPM, '/DPM') 

if __name__ == '__main__': 
    app.run(debug=True) 

はどこが間違ってここにしましたか?

答えて

2

APIに公開するクラスは、Resourceから継承する必要があります。このクラスは、出力をレンダリングできるas_viewなどの基本的なメソッドを実装しています。私はあなたが必要なパッケージがインストールされていると仮定しています

from flask import Flask 
from flask_restful import Resource, Api 

app = Flask(__name__) 
api = Api(app) 

class DPM(Resource): 
    def __init__(self): 
     self.time = '[12.18]' 
     self.month = "11" 
    def get(self): 
     return self.__dict__ 

api.add_resource(DPM, '/DPM') 

if __name__ == '__main__': 
    app.run(debug=True) 
+0

グレート。できます。しかし、実際にas__viewメソッドを利用するために、プラグイン可能なクラスベースのビューをインポートするべきではありませんか? JSONにデータをシリアル化するためにimport jsonを使用する必要がない理由を簡単に説明してください。 –

+0

APIのアイデアは、既に知られている関数やメソッドを記述する必要はありません。この場合は、リソース・インプリメンテーションはクラス・ベースのビューを継承し、実装し、jsonを公開します。つまり、このクラスでは、動詞GET、POST、DELETE、PUTを使用するときに呼び出されるget、post、delete、putメソッドを実装することが期待されます。結論として、APIは人生をより楽にしてくれます。これらのメソッドを実装し、公開するデータの辞書を返すだけで済みます。 – eyllanesc

+0

こんにちは@eyllanesc。例えば、インテルネットワーク上のlocalhost上で実行されているCentOSサーバー(これは多分10.210.1.99のIP)上でこれをテストしているとしたら、同じネットワーク内の他のコンピュータに同じ要求を送信する方法を知っていますか?私は10.210.1.99:5000または10.210.1.99:5000/DPMのブラウジングを試みましたが、失敗しました。しかし私がPC 10.210.1.99からpingをすると、私は応答を受けました。 –

0

(jsonify flask_restfulを、)

class DPM(Resource): 
    def get(self): 
     cur = mysql.connection.cursor() 
     result = cur.execute('your sql command here') 
     list= cur.fetchall() 
     mysql.connection.commit() 
     cur.close() 
     rest_list = jsonify(list) 
     return rest_list 

api.add_resource(DPM, '/dpm') 

if name == '__main__': 
    app.run() 

これはflask_restfulとORMずにMySQLのです。そして、あなたはGETのための例のように、いくつかのメソッドを実装する必要があり

You can find full http methods on flask rest here

関連する問題