9

Flask フレームワークと Flask-RESTful プラグインを使用して RESTful API を作成しています。Resourceのように、このプラグインが提供するクラスの上に API クラスを定義します。ただし、メソッドを使用してクラスを登録したい場合、次のエラーが発生します。add_resource

AttributeError: type object 'UserAPI' has no attribute 'as_view'

as_viewメソッドはFlask Pluggable Viewsの一部であり、これはViewクラスです。Resourceクラスはこのクラスの上に構築され、私のクラスUserAPIはクラスの上に構築されResourceます。このため、as_viewメソッドを継承する必要がありますが、そうではありません。

問題になる可能性のあるアイデアはありますか?

ここで、クラスをどのように定義したかを確認できます。

from app import api, db
from flask.ext.restful import Resource, abort
from models import *

class UserAPI(Resource):

    def get(self, user_id):
            user = User.query.filter(User.id == user_id)[0]
            if user is None:
                    abort(404, message="User {} doesn't exist".format(user_id))

            else:
                    return {'user' : user}, 201

api.add_resource(UserAPI, '/api/v0.1/users/<int:user_id>', endpoint = 'user')

編集:

これは完全なトレースバックです:

Traceback (most recent call last):
  File "/home/app/queries.py", line 35, in <module>
    api.add_resource(UserAPI, '/api/v0.1/users/<int:user_id>', endpoint = 'user')
  File "/home/app_env/local/lib/python2.7/site-packages/flask_restful/__init__.py", line 344, in add_resource
    self._register_view(self.app, resource, *urls, **kwargs)
  File "/home/app_env/local/lib/python2.7/site-packages/flask_restful/__init__.py", line 362, in _register_view
    resource_func = self.output(resource.as_view(endpoint))
AttributeError: type object 'UserAPI' has no attribute 'as_view'

ここでは、ViewResourceクラスにはas_viewメソッドがあり、私のUserAPIクラスにはありません:

>>> import inspect
>>> from flask.views import View
>>> inspect.getmembers(View, predicate=inspect.ismethod)
[('as_view', <bound method type.as_view of <class 'flask.views.View'>>), ('dispatch_request', <unbound method View.dispatch_request>)]
>>>
>>> from flask.ext.restful import Resource
>>> inspect.getmembers(Resource, predicate=inspect.ismethod)
[('as_view', <bound method MethodViewType.as_view of <class 'flask_restful.Resource'>>), ('dispatch_request', <unbound method Resource.dispatch_request>)]
>>>
>>> from app.queries import UserAPI
>>> inspect.getmembers(UserAPI, predicate = inspect.ismethod)
[('__init__', <unbound method UserAPI.__init__>), ('__repr__', <unbound method UserAPI.__repr__>), ('get', <unbound method UserAPI.get>)]
4

4 に答える 4

11

コードをスキャンした後、クラスが FlaskResourceのクラスから継承されていることがわかりました。MethodViewさて、ようやくクラスではなくクラスas_viewから直接継承してメソッドを取得することができました。これは:MethodViewResource

from app import api, db
from flask.ext.restful import abort
from flask.views import MethodView
from models import *

class UserAPI(MethodView):

     def get(self, user_id):
         user = User.query.filter(User.id == user_id)[0]
         if user is None:
             abort(404, message="User {} doesn't exist".format(user_id))
         else:
             return {'user' : user}, 201

api.add_resource(UserAPI, '/api/v0.1/users/<int:user_id>', endpoint = 'user')

誰かがこれを役に立てば幸いです。

于 2014-02-11T07:12:27.967 に答える