flask_restplus add_namespace不再获取属性'as_view'

时间:2017-11-28 08:22:08

标签: python flask

我写了一个烧瓶,尝试使用带有命名空间的蓝图来组织它,遵循tutorial

我遇到了一些问题,并浏览了互联网,并在12中提供了审核解决方案。第一个与我的工作无关,第二个解决方案并不能解决我的问题。

以下是我的代码:

项目/ project.py

from flask import Flask, jsonify, url_for
from .apis.apis import api

app = Flask(__name__)

app.register_blueprint(api, url_prefix="/api")

项目的/ apis / apis.py

from flask import Blueprint
from .user.authentication import auth
from flask_restplus import Api, apidoc, Resource

blueprint = Blueprint("api", __name__)

api = Api(blueprint, doc='/docs', ui=False)

api.add_namespace(auth, path="/auth") #Keep getting error at this line

项目的/ apis /用户/ authentication.py

from flask_restplus import Namespace

auth = Namespace('auth', description='Authentication')

@auth.route("/test")
def authentication():
    return "test"

堆栈跟踪

    Traceback (most recent call last):
        File "/home/gaara/Python/Flask-Api/project/__init__.py", line 1, in <module>
            from .project import app
        File "/home/gaara/Python/Flask-Api/project/project.py", line 3, in <module>
            from .apis.apis import api
        File "/home/gaara/Python/Flask-Api/project/apis/apis.py", line 13, in <module>
            api.add_namespace(auth, path="/auth")
        File "/home/gaara/Python/Flask-Api/venv/lib/python3.6/site-packages/flask_restplus/api.py", line 413, in add_namespace
            self.register_resource(ns, resource, *self.ns_urls(ns, urls), **kwargs)
        File "/home/gaara/Python/Flask-Api/venv/lib/python3.6/site-packages/flask_restplus/api.py", line 255, in register_resource
            self._register_view(self.app, resource, *urls, **kwargs)
        File "/home/gaara/Python/Flask-Api/venv/lib/python3.6/site-packages/flask_restplus/api.py", line 276, in _register_view
            resource_func = self.output(resource.as_view(endpoint, self, *resource_class_args,
    AttributeError: 'function' object has no attribute 'as_view'

我不知道为什么我一直收到这个错误,尝试了一些方法,在__init__.py中包含put apis.py并更改导入,但总是得到相同的错误。

我希望以组织方式对api进行编码,当转到localhost:5000/api/auth/test时,它会输出test

2 个答案:

答案 0 :(得分:2)

您定义了一个函数,但是Flask restplus需要一个类,您也可以在本教程中看到。

所以它应该看起来像这样:

from flask_restplus import Resource

    @auth.route("/test") 
    class Authentication(Resource):
        def get(self):
            return "test"

答案 1 :(得分:0)

虽然认可的答案是完全正确的,但让我处理为什么我们总是说,如果有可能,并不意味着你应该做! 因此,以下内容对每个人来说都是一个反模式的教训(对我来说是第一名)!

我在这里和那里有点修补,我发现了像你提到的功能需要什么才能被框架注册和使用,比如 F-Restplus(我在我的例子中使用了 F-RestX ==0.5.0,但实际上是它的一个分支),我们开始:

def avg(dummy_self_var=''):
    # the dummy_self_var is needed in order to trick and pretend to be as an instance method
    result = 'any-calculation-that-has-to-be-made'
    logging.debug(f'AVG result is: {result}')

    return Response(str(result))


# imitating that this function is a Resource :D
avg.view_class = Resource
avg.as_view = Resource.as_view # at the end, it could be the following function as well: `lambda x,y: avg`
avg.view_class.methods = {'GET', }
avg.view_class.get = avg

api.add_resource(avg, '/asd')

在此帮助下,我实现了相同的功能,它可以工作 & gets registered automatically by the Swagger-UI docs:

因此,虽然几乎一切皆有可能,但我无法想象有人需要这种“解决方法”的情况,相反,为了向前兼容,我肯定会重构而不是在从长远来看。当然,选择权在你。