移动Flask-Restplus Swagger API文档

4
我希望您能够使用 flask-restplus 来构建 Python 中的 restful API。我希望将 swagger 文档放置在与正常“/”不同的位置。
我正在遵循 这里 的文档并已经按照说明进行了操作。我正在使用 python2.7.3 并具有以下代码 ~/dev/test/app.py:
from flask import Flask
from flask.ext.restplus import Api, apidoc

app = Flask(__name__)
api = Api(app, ui=False)

@api.route('/doc/', endpoint='doc')
def swagger_ui():
    return apidoc.ui_for(api)

app.register_blueprint(apidoc.apidoc)

当我尝试运行这个 python app.py 时,我得到了以下结果:
Traceback (most recent call last):
  File "app.py", line 7 in <module>
    @api.route('/doc/', endpoint='doc')
  File "/home/logan/.virtualenvs/test/lib/python2.7/site-packages/flask_restplus/api.py", line 191, in wrapper
    self.add_resources(cls, *urls, **kwargs)
  File "/home/logan/.virtualenvs/test/lib/python2.7/site-packages/flask_restplus/api.py", line 175, in add_resource
    super(Api, self).add_resource(resource, *urls, **kwargs)
  File "/home/logan/.virtualenvs/test/lib/python2.7/site-packages/flask_restful/__init__.py", line 396, in add_resource
    self._register_view(self.app, resource, *urls, **kwargs)
  File "/home/logan/.virtualenvs/test/lib/python2.7/site-packages/flask_restful/__init__.py", line 435, in _register_view
    resource_func = self.output(resource.as_view(endpoint, *resource_class_args,
AttributeError: 'function' object has no attribute 'as_view'

我不太确定出了什么问题,我想我明白我没有继承 Resource,这是 as_view 通常来自的地方,但文档似乎表明这应该可行。

任何帮助都将不胜感激。

3个回答

6

使用 Flask-Restplus <= 0.8.0 版本,您应该编写如下代码:

from flask import Flask
from flask.ext.restplus import Api, apidoc

app = Flask(__name__)
api = Api(app, ui=False)

@app.route('/doc/', endpoint='doc')
def swagger_ui():
    return apidoc.ui_for(api)

请注意使用@app而不是@api 从v0.8.1开始(即将发布的版本),您只需编写以下内容:
from flask import Flask
from flask.ext.restplus import Api, apidoc

app = Flask(__name__)
api = Api(app, doc='/doc/')

请看:http://flask-restplus.readthedocs.org/en/latest/swagger.html#swagger-ui

URL http://flask-restplus.readthedocs.org/en/latest/swaggerui.html 返回404。 - tw1742
1
是的,文档有新版本了,现在是:http://flask-restplus.readthedocs.org/en/latest/swagger.html#swagger-ui - noirbizarre

2

我最近也遇到了同样的问题,以下是我的解决方法:

from flask import Flask, Blueprint
from flask.ext.restplus import Api, apidoc

app = Flask(__name__)

blueprint = Blueprint('api', __name__)
api = Api(blueprint, ui=False)

@blueprint.route('/doc/', endpoint='doc')
def swagger_ui():
   return apidoc.ui_for(api)

app.register_blueprint(blueprint)

你是对的。从0.8.1开始,你将不再需要这样做,你只需要设置doc参数即可。请参阅http://flask-restplus.readthedocs.org/en/latest/swaggerui.html。 - noirbizarre

0

看起来 @api 需要 Resource,所以我稍微修改了代码来解决这个错误。以下代码只能在 /doc/ 路径下工作,而不是默认的根路径。

from flask import Flask, make_response
from flask.ext.restplus import Api, apidoc, Resource

app = Flask(__name__)
api = Api(app, ui=False)

@api.route('/doc/', endpoint='doc', doc=False)
class ApiDoc(Resource):
    def get(self):
        return make_response(apidoc.ui_for(api))

app.register_blueprint(apidoc.apidoc)

if __name__ == '__main__':
    app.run(debug=True)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接