我正在使用Flask框架和Flask-RESTful插件编写RESTful API。我在此插件提供的Resource
类之上定义了我的API类,如examples中所述。但是,当我想使用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'
在这里,您可以看到View
和Resource
类如何使用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>)]
答案 0 :(得分:12)
我有同样的问题。对我来说这是一个导入错误。
我有以下文件结构:
app.py
resources/__init__.py
resources/SomeResource.py
在app.py中,我有以下代码:
from resources import SomeResource
# ...
api.add_resource(SomeResource, '/someresource')
# ...
错误是由于导入行造成的。应该是:
from resources.SomeResource import SomeResource
答案 1 :(得分:8)
扫描完代码后,我发现Resource
类继承自Flask的MethodView
类。好吧,最后我通过直接从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')
我希望有人觉得这很有帮助。
答案 2 :(得分:0)
我遇到了同样的问题,但这是由于常规烧瓶视图和剩余资源视图中的视图名称重复。
例如在route.py
中@products.route('/api/products', methods=['GET'])
def items():
"some code here"
在Rest-full apis.py中
class Items(Resource):
def get(self):
"Some code here"
api.add_resource(Items, '/hello')
当我更改视图名称之一时,它对我来说很好用。
答案 3 :(得分:0)
这是一个旧线程,但如果你真的使用那个版本的 f-restful 包(~0.8.0),那可能是一个错误。
否则,对于每个新人,使用导入Resource 类的新方法: See the official docs
它说:
<块引用>class flask_restful.Resource
虽然你不应该使用:from flask.ext.restful import Resource, 什么意思
<块引用>flask.ext.restful.Resource