首页 文章

移动Flask-Restplus Swagger API文档

提问于
浏览
3

我正在尝试使用flask-restplus在python中构建一个restful API . 我希望将swagger文档放在与普通“/”不同的地方 .

我正在按照文档here并按照说明进行操作 . 我正在使用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'

我'm not really sure what exactly is going wrong, I guess I understand that I haven't继承自 Resource ,这通常来自 as_view ,但文档似乎表明这应该有用 .

任何帮助都会得到帮助 .

3 回答

  • 4

    使用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

  • 0

    在最近自己挣扎之后,我对这种方法很幸运:

    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)
    
  • 2

    看起来@api需要资源,所以我修改了一些代码来解决错误 . 以下内容仅适用于/ 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)
    

相关问题