Hi all

I'm encountering a difficult to solve unicode problem whilst saving data to
the database. Worst of all, any attempt to reduce it to a simple test case,
or reproduce it in the console fail(!). This is on django 1.0.

The process encountering the error is a simple daemon, run from a management
command [1]. The process looks up a task [2] to run and executes it. After
the task has finished executing, it updates the generated_content member on
the model, either to contain any pertinent error messages if there was a
failure, or to store rendered HTML if the task was successful.

The problem occurs when the generated HTML contains particular unicode
characters (in this case, right single quotation mark, \u2019), which for
some reason prompts django or MySQLdb to decide to convert it to unicode.
The unicode HTML comes from rendering a django template; here's the snippet
that generates the HTML:

      cdict = { ... } # left out; template renders correctly, so not
important..
      ctxt = Context(cdict)
      from django.template import loader
      content = loader.render_to_string('the_template.html',
context_instance=ctxt)
      self.task.generated_content = content

This code is called from MigrationTask::execute() - this is in the (working)
PerformMigration class - and is the last thing that happens before we call
save() on the modified instance. Apart from the generated_content, the only
other thing that changes on this model as a result of this code is the
status attribute.

When we do call save(), the following traceback is produced:

Traceback (most recent call last):
  File
"/usr/local/www/django/ssosp/externals/identity_provider/tasks/management/commands/taskrunner.py",
line 44, in handle
    task.execute()
  File
"/usr/local/www/django/ssosp/externals/identity_provider/tasks/models.py",
line 39, in execute
    self.save()
  File
"/usr/local/www/django/ssosp/root/lib/python2.5/site-packages/django/db/models/base.py",
line 307, in save
    self.save_base(force_insert=force_insert, force_update=force_update)
  File
"/usr/local/www/django/ssosp/root/lib/python2.5/site-packages/django/db/models/base.py",
line 358, in save_base
    rows = manager.filter(pk=pk_val)._update(values)
  File
"/usr/local/www/django/ssosp/root/lib/python2.5/site-packages/django/db/models/query.py",
line 429, in _update
    return query.execute_sql(None)
  File
"/usr/local/www/django/ssosp/root/lib/python2.5/site-packages/django/db/models/sql/subqueries.py",
line 117, in execute_sql
    cursor = super(UpdateQuery, self).execute_sql(result_type)
  File
"/usr/local/www/django/ssosp/root/lib/python2.5/site-packages/django/db/models/sql/query.py",
line 1700, in execute_sql
    cursor.execute(sql, params)
  File
"/usr/local/www/django/ssosp/root/lib/python2.5/site-packages/django/db/backends/mysql/base.py",
line 83, in execute
    return self.cursor.execute(query, args)
  File "/usr/local/lib/python2.5/site-packages/MySQLdb/cursors.py", line
151, in execute
    query = query % db.literal(args)
  File "/usr/local/lib/python2.5/site-packages/MySQLdb/connections.py", line
247, in literal
    return self.escape(o, self.encoders)
  File "/usr/local/lib/python2.5/site-packages/MySQLdb/connections.py", line
180, in string_literal
    return db.string_literal(obj)
UnicodeEncodeError: 'ascii' codec can't encode character u'\u2019' in
position 1182: ordinal not in range(128)

If I set a break point where we generate the content, print out
repr(content), copy paste that into a django python shell and assign it to a
task's generated_content property, it saves correctly.

If I manually change content to u'\u2019' inside the debugger, it also saves
correctly. It also works correctly for u'\u2019'*2048, just in case size of
string matters.

The database and all tables are set to UTF-8 in mysql. My locale is
correctly set up in both cases (en_GB.UTF-8). I'm very confused as to why it
is attempting to convert it to ascii :/

Any hints/tips greatly appreciated.

Cheers

Tom

[1] http://pastebin.com/m9e23563
[2] http://pastebin.com/m564e1cd7

--

You received this message because you are subscribed to the Google Groups 
"Django users" group.
To post to this group, send email to django-us...@googlegroups.com.
To unsubscribe from this group, send email to 
django-users+unsubscr...@googlegroups.com.
For more options, visit this group at 
http://groups.google.com/group/django-users?hl=.


Reply via email to