6 messages in com.googlegroups.pylons-discussRe: pylons, unicode and german umlaut...
FromSent OnAttachments
Saibot28 Apr 2008 23:55 
Saibot29 Apr 2008 02:14 
Dalius Dobravolskas29 Apr 2008 02:26 
Saibot29 Apr 2008 06:55 
Kumar McMillan29 Apr 2008 08:17 
Ben Bangert29 Apr 2008 13:15 
Subject:Re: pylons, unicode and german umlauts in urls
From:Kumar McMillan (kuma@gmail.com)
Date:04/29/2008 08:17:25 AM
List:com.googlegroups.pylons-discuss

On Tue, Apr 29, 2008 at 1:56 AM, Saibot <tobi@gmail.com> wrote:

Hi,

I have already reached a dead end, although I am still at the beginning of my project. Perhaps somebody can help me out of this mess:

I am trying to write a tool to browse data in databases. Unfortunately the database I am working with is a ms-sql database which has german umlauts in its table- and cloumn names. When reflecting tables from this database I have to overwrite the columnames with ascii-names to allow sqlalchemy to map the tables to classes. sqlalchemy.convert_unicode is true and sqlalchemy.encoding is set to cp1252. So far so good. Now I want to display my tables in a generic way:

[Controller] c.table=table column = request.GET.get('column') c.columns = meta.metadata.tables.get(table).c c.items = meta.metadata.tables.get(table).select().order_by(column).limit(10).execute() return render('/databrowse/table.html')

[View] <table> <tr> % for column in c.columns: <th> <a href="${h.url_for(controller="databrowse", action="table", table=c.table, column=column.name)}">${column.name}</a>

right here, you need:

${h.url_for(... table=c.table.encode('cp1252'), column=column.name.encode('cp1252'))}

because Routes is not expecting query string parameters to be Unicode. Should it? I'm not sure, but sqlalchemy is doing the right thing, it has converted those values to Unicode for you already.

for a broader explanation of the magic Python is doing behind the scenes that caused your error, this may help: http://farmdev.com/talks/unicode/

</th> % endfor </tr>

% for item in c.items: <tr> % for column in c.columns: <td>${item[column.name]}</td> % endfor </tr> % endfor

</table>

but routes produces some unicode error when calling h.url_for(controller="databrowse", action="table", table=c.table, column=column.name in the template:

File 'c:\\TTL\\ttl\\controllers\\databrowse.py', line 29 in table return render('/databrowse/table.html') File 'c:\\python25\\lib\\site-packages\\pylons-0.9.6.1-py2.5.egg\ \pylons\\templating.py', line 343 in render format=format, namespace=kargs, **cache_args) File 'c:\\python25\\lib\\site-packages\\pylons-0.9.6.1-py2.5.egg\ \pylons\\templating.py', line 228 in render **options) File 'c:\\python25\\lib\\site-packages\\mako-0.1.8-py2.5.egg\\mako\\ext \\turbogears.py', line 49 in render return template.render(**info) File 'c:\\python25\\lib\\site-packages\\mako-0.1.8-py2.5.egg\\mako\ \template.py', line 114 in render return runtime._render(self, self.callable_, args, data) File 'c:\\python25\\lib\\site-packages\\mako-0.1.8-py2.5.egg\\mako\ \runtime.py', line 287 in _render _render_context(template, callable_, context, *args, **_kwargs_for_callable(callable_, data)) File 'c:\\python25\\lib\\site-packages\\mako-0.1.8-py2.5.egg\\mako\ \runtime.py', line 304 in _render_context _exec_template(inherit, lclcontext, args=args, kwargs=kwargs) File 'c:\\python25\\lib\\site-packages\\mako-0.1.8-py2.5.egg\\mako\ \runtime.py', line 337 in _exec_template callable_(context, *args, **kwargs) File 'c:\\TTL\\data\\templates\\databrowse\\site.html.py', line 26 in render_body context.write(unicode(self.body())) File 'c:\\python25\\lib\\site-packages\\mako-0.1.8-py2.5.egg\\mako\ \runtime.py', line 193 in <lambda> return lambda *args, **kwargs:callable_(self.context, *args, **kwargs) File 'c:\\TTL\\data\\templates\\databrowse\\table.html.py', line 38 in render_body context.write(unicode(h.url_for(controller="databrowse", action="table", table=c.table, column=column.name))) File 'c:\\python25\\lib\\site-packages\\routes-1.7.1-py2.5.egg\\routes\ \util.py', line 189 in url_for url = config.mapper.generate(*route_args, **newargs) File 'c:\\python25\\lib\\site-packages\\routes-1.7.1-py2.5.egg\\routes\ \base.py', line 949 in generate path = route.generate(**kargs) File 'c:\\python25\\lib\\site-packages\\routes-1.7.1-py2.5.egg\\routes\ \base.py', line 544 in generate (key != 'action' or key != 'controller')]) File 'C:\\Python25\\lib\\urllib.py', line 1250 in urlencode v = quote_plus(str(v)) UnicodeEncodeError: 'ascii' codec can't encode character u'\xdf' in position 6: ordinal not in range(128)

Can anybody explain me what I am doing wrong?

Thanks in advance!