Python помещает escape-символы в ответ веб-сервисов Swagger - PullRequest
0 голосов
/ 29 октября 2018

У меня есть хранимая процедура Oracle, которая возвращает переменную типа CLOB с информацией в формате JSON. Эта переменная поймала ее в Python и я возвращаю его для веб-службы. Вывод процедуры магазина имеет следующий стиль:

{"role":"Proof_Rol","identification":"31056235002761","class":"Proof_Clase","country":"ARGENTINA","stateOrProvince":"Santa Fe","city":"Rosario","locality":"Rosario","streetName":"Brown","streetNr":"2761","x":"5438468,710153","y":"6356634,962204"}

Но при выходе из службы Python это выглядит следующим образом:

{"Atributos": "{\"role\":\"Proof_Rol\",\"identification\":\"31056235002761\",\"class\":\"Proof_Clase\",\"country\":\"ARGENTINA\",\"stateOrProvince\":\"Santa Fe\",\"city\":\"Rosario\",\"locality\":\"Rosario\",\"streetName\":\"Brown\",\"streetNr\":\"2761\",\"x\":\"5438468,710153\",\"y\":\"6356634,962204\"}"}

enter image description here

Кто-нибудь знает, как воспрепятствовать тому, чтобы escape-символы вводили эту строку при выходе из службы?

Часть моего кода Python:

api = Api(APP, version='1.0', title='attributes API',
          description='Attibute Microservice\n'
                      'Conection DB:' + db_str + '\n'
                                                  'Max try:' + limite)
 ns = api.namespace('attributes', description='Show descriptions of an object')

md_respuesta = api.model('attributes', {
    'Attribute': fields.String(required=True, description='Attribute List')
})

class listAtriClass:
    Attribute = None

@ns.route('/<string:elementId>')
@ns.response(200, 'Success')
@ns.response(404, 'Not found')
@ns.response(429, 'Too many request')
@ns.param('elementId', 'Id Element (ej:31056235002761)')
class attibuteClass(Resource):
    @ns.doc('attributes')
    @ns.marshal_with(md_respuesta)
    def post(self, elementId):
        try:
            cur = database.db.cursor()
            listOutput = cur.var(cx_Oracle.CLOB)
            e, l = cur.callproc('attributes.get_attributes', (elementId, listOutput))
        except Exception as e:
            database.init()
            if database.db is not None:
                log.err('Reconection OK')
                cur = database.db.cursor()
                listOutput = cur.var(cx_Oracle.CLOB)
                e, l = cur.callproc('attributes.get_attributes', (elementId, listOutput))
                print(listOutput)
            else:
                log.err('Conection Fails')
                listOutput = None
        result = listAtriClass()
        result.Attribute =listOutput.getvalue()
        print(result.Attribute)
        return result, 200

1 Ответ

0 голосов
/ 29 октября 2018

Attribute определяется как fields.String, но на самом деле его следует определять как fields.Nested.

attribute_fields = {
    "role": fields.String,
    "identification": fields.String,
    "class": fields.String,
    # ...you get the idea.
}

md_respuesta = api.model('attributes', {
    'Attribute': fields.Nested(attribute_fields)
})

Обновление для flask-restplus

В flask-restplus вложенное поле также должно регистрировать модель.

attribute_fields = api.model('fields', {
    "role": fields.String,
    "identification": fields.String,
    "class": fields.String,
    # ...you get the idea.
})

Другой способ - встроить attribute_fields вместо регистрации отдельной модели для него.

md_respuesta = api.model('attributes', {
    'Attribute': {
        'role': fields.String,
        'identification': fields.String,
        'class': fields.String,
        # ...you get the idea.
    }
})
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...