I need to understand if this is a bug or if it is the expected behaviour 
and I'm doing something wrong.

I have two web2py applications. One of them implements an XMLRPC 
webservice, and the other one consumes it.

All the controllers (in both applications) have this first line:
# -*- coding: utf-8 -*-


One of the applications connects to the webservice to call a specific 
function, and it needs to pass some string arguments:

def make_the_call(): 
    from xmlrpclib import ServerProxy
    service = ServerProxy(webservice_url)
    data = {
        'title': 'áéíóú',
        'detail': 'Detail with special characters like ñ or Ç'
    }
    service.add_content(data)


The application that implements the webservice:

from gluon.tools import Service

service = Service()


def call():
    return service()


def add_content(data):
    db.content.insert(
        title=data.get('title'),
        detail=data.get('detail')
    )
    return {'success': True}


But the sentence service.add_content(data) fails with this error and 
traceback:

Traceback (most recent call last):
  File "/home/gonguinguen/medios/gluon/restricted.py", line 219, in restricted
    exec(ccode, environment)
  File "/home/gonguinguen/medios/applications/webmedios/controllers/admin.py", 
line 707, in <module>
  File "/home/gonguinguen/medios/gluon/globals.py", line 421, in <lambda>
    self._caller = lambda f: f()
  File "/home/gonguinguen/medios/applications/webmedios/controllers/admin.py", 
line 704, in test
    admin_password_sitio='93c824d1-91c4-428f-8542-db5db9d4594b')
  File "/home/gonguinguen/medios/applications/webmedios/controllers/admin.py", 
line 695, in instalar_demo_contenido
    r = server.add_content(data)
  File "/usr/lib64/python2.7/xmlrpclib.py", line 1233, in __call__
    return self.__send(self.__name, args)
  File "/usr/lib64/python2.7/xmlrpclib.py", line 1591, in __request
    verbose=self.__verbose
  File "/usr/lib64/python2.7/xmlrpclib.py", line 1273, in request
    return self.single_request(host, handler, request_body, verbose)
  File "/usr/lib64/python2.7/xmlrpclib.py", line 1306, in single_request
    return self.parse_response(response)
  File "/usr/lib64/python2.7/xmlrpclib.py", line 1482, in parse_response
    return u.close()
  File "/usr/lib64/python2.7/xmlrpclib.py", line 794, in close
    raise Fault(**self._stack[0])
Fault: <Fault 1: "<type 'exceptions.UnicodeEncodeError'>:'ascii' codec can't 
encode character u'\\xe1' in position 1: ordinal not in range(128)">



To make it work, I need to reload sys and set default encoding in the 
add_content() method of the webservice:

def add_content(data):
    import sys
    reload(sys)
    sys.setdefaultencoding('utf8')
    db.content.insert(
        title=data.get('title'),
        detail=data.get('detail')
    )
    return {'success': True}


After that, it works ok.
But here is the weird part: after having made one successfull call to the 
webservice method, I can remove the lines where I reload the sys, and it 
keeps working ok. But if I reload uwsgi, it starts throwing error again.

Anyway, I've read that reloading sys is not a good practise at all. So I'm 
pretty lost. I presumed that I could add "# -*- coding: utf-8 -*-" and 
forget about the encoding problems. 

What should I do?


-- 
Resources:
- http://web2py.com
- http://web2py.com/book (Documentation)
- http://github.com/web2py/web2py (Source code)
- https://code.google.com/p/web2py/issues/list (Report Issues)
--- 
You received this message because you are subscribed to the Google Groups 
"web2py-users" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to web2py+unsubscr...@googlegroups.com.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/web2py/584c8981-b4cd-4fe9-9b46-289a68a67d42%40googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to