【问题标题】:Flask-Restful error: "as_view" method not inheritedFlask-Restful 错误:“as_view”方法未继承
【发布时间】: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'

在这里你可以看到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>)]

【问题讨论】:

  • 这确实是一个奇怪的例外;是时候添加调试打印了。 print dir(UserAPI)print UserAPI.mro() 都不错。你能分享这两个的输出吗?完整的引用也会有所帮助。

标签: python python-2.7 flask flask-restful


【解决方案1】:

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

我有以下文件结构:

app.py
resources/__init__.py
resources/SomeResource.py

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

from resources import SomeResource
# ...
api.add_resource(SomeResource, '/someresource')
# ...

错误是由于导入行引起的。应该是:

from resources.SomeResource import SomeResource

【讨论】:

  • 谢谢。但这太可怕了!如果它不存在,为什么它甚至让导入通过?我在这上面浪费了太多时间。
  • 我遇到了完全相同的问题-我没想到这甚至是方向-谢谢
  • 这非常有用!谢谢!
【解决方案2】:

扫码发现Resource类继承自Flask的MethodView类。好吧,最后我设法通过直接从MethodView 类而不是Resource 类继承来获得as_view 方法。这是:

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')

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

【讨论】:

    【解决方案3】:

    我遇到了同样的问题,但这是由于常规烧瓶视图和完整资源视图中的重复视图名称。

    例如在 routes.py 中

    @products.route('/api/products', methods=['GET'])
    def items():
        "some code here"
    

    在完整的 apis.py 中

    class Items(Resource):
        def get(self):
            "Some code here"
    
    
    api.add_resource(Items, '/hello')
    

    当我更改其中一个视图名称时,它对我来说工作正常。

    【讨论】:

      【解决方案4】:

      它是一个旧线程,但如果你真的使用那个版本的 f-restful 包(~0.8.0),那可能是一个错误。

      否则,对于每个新人,使用导入 Resource 类的新方法: See the official docs

      上面写着:

      class flask_restful.Resource

      虽然你不应该使用 as:from flask.ext.restful import Resource, 什么意思

      flask.ext.restful.Resource

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-01-20
        • 2013-11-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-12-13
        • 2013-07-01
        相关资源
        最近更新 更多