【发布时间】:2014-02-28 02:28:00
【问题描述】:
我正在使用 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>)]
【问题讨论】:
-
这确实是一个奇怪的例外;是时候添加调试打印了。
print dir(UserAPI)和print UserAPI.mro()都不错。你能分享这两个的输出吗?完整的引用也会有所帮助。
标签: python python-2.7 flask flask-restful