我写了一个烧瓶,尝试使用带有命名空间的蓝图来组织它,遵循tutorial
我遇到了一些问题,并浏览了互联网,并在1和2中提供了审核解决方案。第一个与我的工作无关,第二个解决方案并不能解决我的问题。
以下是我的代码:
项目/ 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
答案 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:
因此,虽然几乎一切皆有可能,但我无法想象有人需要这种“解决方法”的情况,相反,为了向前兼容,我肯定会重构而不是在从长远来看。当然,选择权在你。