Перемещение документации API Flask-Restplus Swagger

Я пытаюсь использовать flask-restplus для создания спокойного API на Python. Я бы хотел, чтобы документы 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, но документация, похоже, указывает, что это должно работать.

Любая помощь будет принята.


person loganasherjones    schedule 22.07.2015    source источник


Ответы (3)


С 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

Начиная с версии 0.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

person noirbizarre    schedule 14.10.2015
comment
URL-адрес flask-restplus.readthedocs.org/en/latest/swaggerui.html возвращает 404 - person tw1742; 07.04.2016
comment
Да, есть новая версия документации, сейчас это: flask-restplus.readthedocs.org/en/latest/ - person noirbizarre; 07.04.2016

После того, как я недавно боролся с этим сам, мне повезло с этим подходом:

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)
person quentj    schedule 01.09.2015
comment
Ты прав. Начиная с версии 0.8.1, вам больше не придется этого делать, вам просто нужно будет установить параметр doc. См. flask-restplus.readthedocs.org/en/latest/swaggerui.html - person noirbizarre; 15.10.2015

Похоже, что для @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)
person barryku    schedule 19.11.2015