Search code examples
pythoncherrypy

CherryPy WS is not returning string in UTF-8


I'm trying to build a REST Web Service with CherryPy and Python. It works, but when I access it through Chrome, it's not displaying in UTF-8.

This web service queries a MongoDB and then gives the results in a list of dictionaries. I did a print(ticketME) and it's showing the right characters:

enter image description here

But when it displays in Chrome, is not displaying right(and I'm also realizing that "solucion" or "problema" are not showing...):

enter image description here

As you can see in the code, I set the charset to UTF-8:

import cherrypy
import pymongo
import urllib
import pyodbc
import mysql.connector
from datetime import datetime
import time
import sys
import numpy as np

class HelloWorld(object):


    @cherrypy.expose
    @cherrypy.tools.json_out()
    def index(self):
        password = * password *
        myclient = pymongo.MongoClient(*mongoDB connection string*)
        mydb = myclient["moica2"]
        mycol = mydb["moicaTickets"]

        myquery = *mongoDB aggregate query*
        mydoc = mycol.aggregate(myquery)
        mydb = None
        myclient.close()
        mycol = None

        resultadoTicketsME = []

        for x in mydoc:
            try:
                asunto = x['pAsunto']
                nrotkt = x['pTicket']
                estado = x['pEstado']
                fechaCreacion = x['pFechaCreacion']
                fechaCierre = x['pFechaCierre']
                nodoCRM =  x['pNodoCRM']
                nodoCMTS = x['pNodoCMTS']
                if ('COMPLETO' in nodoCMTS):
                    nodoCMTS = "Completo"
                RTs = x['pRTs']
                notas = x['pNotas']
                asuntoCierre = x['pAsuntoCierre']
                estadoEtaClick = x['pEstadoEtaClick']
                afectacion = x['pAfectacion']
                problema = x['pProblema']
                solucion = x['pSolucion']
                arbolCreacion = x['pElArbolCreacion']
                arbolActual = x['pElarbolActual']
                idFuente = int(x['pFuente']['idFuente'])

                ticketME = {
                    'nrotkt': nrotkt, 
                    'asunto': asunto, 
                    'estado': estado, 
                    'fechaCreacion': fechaCreacion, 
                    'fechaCierre': fechaCierre, 
                    'nodoCRM': nodoCRM, 
                    'nodoCMTS': nodoCMTS, 
                    'RTs': RTs, 
                    'notas': notas, 
                    'asuntoCierre': asuntoCierre, 
                    'estadoEtaClick': estadoEtaClick, 
                    'afectacion': afectacion, 
                    'problema': problema, 
                    'solucion': solucion, 
                    'arbolCreacion': arbolCreacion, 
                    'arbolActual': arbolActual, 
                    'idFuente': idFuente
                }

                print(ticketME)
                resultadoTicketsME.append(ticketME)

            except:

                lf = open("error.log", "a+")
                lf.write("MOICA2FUENTESME %s : No se pudo insertar el tkt %s\n" % (datetime.now().strftime("%Y-%m-%d %H:%M:%S"),x['pTicket']))
                lf.close()

        cherrypy.response.headers['Content-Type'] = "text/html;charset=utf-8" 
        return  resultadoTicketsME

USERS = {'ngabioud': 'password'}

def validate_password(realm, username, password):
    if username in USERS and USERS[username] == password:
       return True
    return False

cherrypy.config.update({'tools.encode.on': True,
                         'tools.encode.encoding': 'utf-8',
                         'tools.decode.on': True,
                         'tools.auth_basic.on': True,
                        'tools.auth_basic.realm': 'localhost',
                        'tools.auth_basic.checkpassword': validate_password,
                        'tools.auth_basic.accept_charset': 'UTF-8',
                        })
cherrypy.quickstart(HelloWorld())

Is there anything else I could try?

Thank you, Best regards


Solution

  • As stated by snakecharmerb in the comment, it was a Chrome representing issue. I did a .php seting encoding to utf-8 and it showed correctly.