Не работает регистрация нескольких чертежей restplus с одним и тем же префиксом

Итак, я создаю API с помощью Flask-RestPlus и использую схемы для разделения кода на более мелкие части, но при попытке зарегистрировать несколько конечных точек API с одинаковым префиксом URL-адреса регистрируется только одна схема.

Шаблоны чертежей:

from flask import Blueprint
from flask_restplus import Api, Resource

tmpl_bp = Blueprint('templates_api', __name__)
api = Api(tmpl_bp)

ns_tmpl = api.namespace('templates', description='Templates operations')

@ns_tmpl.route('/')
class Templates(Resource):
    def get(self):
        return "All templates"

    def post(self):
        return "Added/updated template"

Визуализация чертежа:

from flask import Blueprint
from flask_restplus import Api, Resource

rend_bp = Blueprint('render_api', __name__)
api = Api(rend_bp)

ns_render = api.namespace('render', description='Render actions')

@ns_render.route('/')
class Render(Resource):
    def post(self):
        return "Rendering everything"

Основной код приложения, в котором происходит регистрация:

from flask import Flask, render_template

from api.templates import tmpl_bp
from api.render import rend_bp

app = Flask(__name__)

app.register_blueprint(tmpl_bp, url_prefix="/api/v1")
app.register_blueprint(rend_bp, url_prefix="/api/v1")


@app.route('/')
def home():
    return "This is the main page"

Полученный в результате Swagger API:  введите описание изображения здесь

Я ожидал, что и шаблоны, и чертежи рендеринга будут обслуживаться на /api/v1/ как /api/v1/templates и /api/v1/render соответственно. Но каждый раз регистрируется только один.

Как сделать так, чтобы оба чертежа обслуживались под одним и тем же префиксом?


person MeLight    schedule 09.12.2019    source источник
comment
Я считаю, что так должны работать чертежи. Какая же польза от того, что каждый ресурс представляет собой отдельный проект? Я смог сделать то, что вам нужно, всего лишь с одним-единственным планом под названием APIBlueprint.   -  person dmitrybelyakov    schedule 10.12.2019


Ответы (1)


Вам не нужно использовать Blueprint, достаточно использовать пространства имен flask_restplus.
Flask-RESTPlus предоставляет способ использовать почти тот же шаблон, что и blueprint Flask. Основная идея - разделить ваше приложение на многоразовые пространства имен.

from flask import Flask, render_template
from flask_restplus import Resource, Api
from api.templates import tmpl_bp
from api.render import rend_bp

app = Flask(__name__)
api = Api(app)

api.add_namespace(tmpl_bp, path="/api/v1/templates")
api.add_namespace(rend_bp, path="/api/v1/render")


@api.route('/')
def home():
   return "This is the main page"

Вы можете найти более подробную информацию здесь, https://flask-restplus.readthedocs.io/en/stable/scaling.html

person HelenShy    schedule 14.01.2020