Flask-Restful错误:"as_view"方法没有继承

Iñi*_*res 4 python flask python-2.7 flask-restful

我正在使用Flask框架和Flask-RESTful插件编写RESTful API.我在Resource这个插件提供的类之上定义了我的API类,如示例所示.但是,当我想使用该add_resource方法注册我的类时,我收到以下错误:

AttributeError: type object 'UserAPI' has no attribute 'as_view'
Run Code Online (Sandbox Code Playgroud)

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')
Run Code Online (Sandbox Code Playgroud)

编辑:

这完全追溯:

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'
Run Code Online (Sandbox Code Playgroud)

在这里你可以看到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>)]
Run Code Online (Sandbox Code Playgroud)

Jon*_*han 13

我有同样的问题.对我来说这是一个导入错误.

我有以下文件结构:

app.py
resources/__init__.py
resources/SomeResource.py
Run Code Online (Sandbox Code Playgroud)

在app.py中,我有以下代码:

from resources import SomeResource
# ...
api.add_resource(SomeResource, '/someresource')
# ...
Run Code Online (Sandbox Code Playgroud)

错误是由于导入行.应该是:

from resources.SomeResource import SomeResource
Run Code Online (Sandbox Code Playgroud)


Iñi*_*res 9

扫描完代码后,我发现Resource该类继承自MethodViewFlask类.好吧,最后我设法as_view通过直接从MethodView类而不是类继承来获取方法Resource.这是:

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')
Run Code Online (Sandbox Code Playgroud)

我希望有人觉得这很有帮助.