[ Foro de Python ]
Tengo un procedimiento oracle que al recibir unos parámetros arroja como resultado una cadena con formato JSON como la siguiente:
{"list_pais": [ {"pais":"URUGUAY"},{"pais":"ARGENTINA"},{"pais":"PARAGUAY"},{"pais":"VENEZUELA"}] }
Este procedimiento es invocado desde un webservice en Python que desarrollé con FlaskResfutl para crear el swagger
import cx_Oracle
import json
from app import APP
import log
import graypy
import database
from flask_restplus import Api, Resource, fields
with open('./config/config_countries.json', 'r') as config_file:
config = json.load(config_file)
log.init()
#Se inicializa la base de datos
#Importando de database la conexión a la BD
database.init()
#Invoca al archivo de configuración
with open('./config/config_countries.json', 'r') as config_file:
config = json.load(config_file)
with open('./config/config_general.json', 'r') as config_file:
config_general = json.load(config_file)
srv_name = config["CONFIG"]["LOG_TAG"]
db_str = config["CONFIG"]["DB"]
max_return = config_general["CONFIG"]["MAX_RETURN"]
limite = config["CONFIG"]["LIMIT_PER_SECOND"]
api = Api(APP, version='1.0', title=srv_name,
description='getCountries de Callejero Predictivo\n'
'Conexión a BD:' + db_str + '\n'
'Cantidad máxima de invocaciones por segundo:' + limite)
ns = api.namespace('getCountry', description='getCountries de Callejero Predictivo')
md_respuesta = {'pais': fields.String(required=True, description='Agrupador de Paises'), 'list_pais': fields.Nested(fields.String)}
@ns.route('/<string:country>')
@ns.response(200, 'Success')
@ns.response(404, 'Not found')
@ns.response(429, 'Too many request')
@ns.param('country', 'Introducir Cadena de Caracteres para el Pais')
class getCountryClass(Resource):
@ns.doc('getCountry')
@ns.marshal_list_with(md_respuesta)
def post(self, country):
try:
cur = database.db.cursor()
listOutput = cur.var(cx_Oracle.STRING)
cur.callproc('PREDICTIVO.get_pais', (country, max_return, listOutput))
except Exception as e:
database.init()
if database.db is not None:
log.err('Reconexion OK')
cur = database.db.cursor()
listOutput = cur.var(cx_Oracle.STRING)
cur.callproc('PREDICTIVO.get_pais', (country, max_return, listOutput))
else:
log.err('Sin conexion a la base de datos')
listOutput = None
return listOutput, 200
pero al ejecutarlo, me genera el siguiente error:
Running on http://127.0.0.1:5200/ (Press CTRL+C to quit)
127.0.0.1 - - [12/Nov/2018 15:52:21] "GET / HTTP/1.1" 200 -
Unable to render schema
Traceback (most recent call last):
File "C:\Program Files\Python37\lib\site-packages\flask_restplus\api.py", line 483, in __schema__
self._schema = Swagger(self).as_dict()
File "C:\Program Files\Python37\lib\site-packages\flask_restplus\swagger.py", line 177, in as_dict
paths[extract_path(url)] = self.serialize_resource(ns, resource, url, kwargs)
File "C:\Program Files\Python37\lib\site-packages\flask_restplus\swagger.py", line 346, in serialize_resource
path[method] = self.serialize_operation(doc, method)
File "C:\Program Files\Python37\lib\site-packages\flask_restplus\swagger.py", line 352, in serialize_operation
'responses': self.responses_for(doc, method) or None,
File "C:\Program Files\Python37\lib\site-packages\flask_restplus\swagger.py", line 464, in responses_for
responses[code]['schema'] = self.serialize_schema(model)
File "C:\Program Files\Python37\lib\site-packages\flask_restplus\swagger.py", line 509, in serialize_schema
'items': self.serialize_schema(model),
File "C:\Program Files\Python37\lib\site-packages\flask_restplus\swagger.py", line 529, in serialize_schema
raise ValueError('Model {0} not registered'.format(model))
ValueError: Model {'pais': <flask_restplus.fields.String object at 0x00000189FFB94C88>, 'list_pais': <flask_restplus.fields.Nested object at 0x00000189FFB94F28>} not registered
127.0.0.1 - - [12/Nov/2018 15:52:22] "GET /swagger.json HTTP/1.1" 500 -
y ya no encuentro qué vueltas darle ni como solucionarlo.
Alguien me pudiese dar pistas para resolverlo?
(No se puede continuar esta discusión porque tiene más de dos meses de antigüedad. Si tienes dudas parecidas, abre un nuevo hilo.)