Как обрабатывать несколько конечных точек «GET» в классе ответов Flask-Restplus - PullRequest
2 голосов
/ 05 июня 2019

Я только начинаю изучать Flask и пытаюсь создать простой API для обработки данных (называемый ATExplorer).

Я начал с создания пространства имен 'backend', то есть backendAPI:

from flask import Flask, Blueprint, redirect, url_for
from flask_restplus import Resource, Api
from werkzeug.routing import Rule

app = Flask(__name__)
app.config.SWAGGER_UI_DOC_EXPANSION = 'list'
blueprint = Blueprint('api', __name__, url_prefix='/api')
api = Api(blueprint, version=0.1, title='AT Pipeline API', doc='/swagger/')
app.register_blueprint(blueprint)
backendAPI = api.namespace('backend', description='Manage ATExplorer backend API.')

Мне нужны две конечные точки, версия , возвращающая версию бэкэнда, например, 0,1 и status , возвращая статус бэкэнда, например, «остановлен» или «работает»

Я создал класс ответа и маршруты вроде этого:

@backendAPI.route('/version', methods=['GET'])
@backendAPI.route('/status',  methods=['GET'])

class Backend(Resource):

     def get(self):
        #How to differentiate between the ../backend/version call and a 
        # ../backend/status call here??
        #if call is for status:
        #     return {'status': 'running'}
        #elif call is for version
        #     return {'version': '0.1'}

Думаю, это вопрос дизайна. Какой «дизайн» предпочтителен для этого случая?

---- РЕДАКТИРОВАТЬ ----- Приведенный выше код можно переписать, получив желаемый конечный (клиентский) результат следующим образом:

class Backend(Resource):
    def __init__(self, api=None, *args, **kwargs):
         #The 'actual' backend resource
         self.backend = atp.backend

@backend_api.route('/status',  methods=['GET'])
class Dummy(Backend):
     def get(self):
         return {'status':self.backend.getStatus()}

@backend_api.route('/version',  methods=['GET'])
class Dummy(Backend):
     def get(self):
         return {'status':self.backend.getVersion()}

Кажется, что флакон допускает несколько классов с одним и тем же именем, делая разные вещи на основе декоратора 'route', то есть имя класса не имеет значения .

Есть ли «учебник» способ выразить вышеуказанную логику?

1 Ответ

1 голос
/ 05 июня 2019

Я считаю, что это больше вопрос flask_restplus, потому что в Flask вы обычно используете методы в качестве маршрутов.

В любом случае, вы рассматривали возможность использования двух разных классов для двух разных действий?

@backendAPI.route('/version', methods=['GET'])
class Version(Resource):
    def get(self):
         return flask.jsonify({"version_number": "0.1"})

@backendAPI.route('/status', methods=['GET'])
class Status(Resource):
    def get(self):
         return flask.jsonify({"status": "running"})
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...