UnicodeEncodeError ao carregar arquivos no Django admin

3

Nota : fiz esta pergunta no StackOverflow, mas percebo que este pode ser um lugar mais adequado para fazer este tipo de pergunta.

Estou tentando enviar um arquivo chamado 'Testaråäö.txt' por meio do aplicativo de administração do Django.

Estou executando o Django 1.3.1 com Gunicorn 0.13.4 e Nginx 0.7.6.7 em um servidor Debian 6. Banco de dados é PostgreSQL 8.4.9. Outros dados Unicode são salvos no banco de dados sem nenhum problema, então eu acho que o problema deve estar com o sistema de arquivos de alguma forma.

eu configurei

http {
    charset utf-8;
}

no meu nginx.conf. LC_ALL e LANG estão configurados para 'sv_SE.UTF-8'. Correndo 'locale' verifica isso. Eu até tentei configurar LC_ALL e LANG no meu script de inicialização nginx apenas para ter certeza de que a localidade está configurada corretamente.

Este é o traceback:

Traceback (most recent call last):

File "/srv/.virtualenvs/letebo/lib/python2.6/site-packages/django/core/handlers/base.py", line 111, in get_response
response = callback(request, *callback_args, **callback_kwargs)

File "/srv/.virtualenvs/letebo/lib/python2.6/site-packages/django/contrib/admin/options.py", line 307, in wrapper
return self.admin_site.admin_view(view)(*args, **kwargs)

File "/srv/.virtualenvs/letebo/lib/python2.6/site-packages/django/utils/decorators.py", line 93, in _wrapped_view
response = view_func(request, *args, **kwargs)

File "/srv/.virtualenvs/letebo/lib/python2.6/site-packages/django/views/decorators/cache.py", line 79, in _wrapped_view_func
response = view_func(request, *args, **kwargs)

File "/srv/.virtualenvs/letebo/lib/python2.6/site-packages/django/contrib/admin/sites.py", line 197, in inner
return view(request, *args, **kwargs)

File "/srv/django/letebo/app/cms/admin.py", line 81, in change_view
return super(PageAdmin, self).change_view(request, obj_id)

File "/srv/.virtualenvs/letebo/lib/python2.6/site-packages/django/utils/decorators.py", line 28, in _wrapper
return bound_func(*args, **kwargs)

File "/srv/.virtualenvs/letebo/lib/python2.6/site-packages/django/utils/decorators.py", line 93, in _wrapped_view
response = view_func(request, *args, **kwargs)

File "/srv/.virtualenvs/letebo/lib/python2.6/site-packages/django/utils/decorators.py", line 24, in bound_func
return func(self, *args2, **kwargs2)

File "/srv/.virtualenvs/letebo/lib/python2.6/site-packages/django/db/transaction.py", line 217, in inner
res = func(*args, **kwargs)

File "/srv/.virtualenvs/letebo/lib/python2.6/site-packages/django/contrib/admin/options.py", line 985, in change_view
self.save_formset(request, form, formset, change=True)

File "/srv/.virtualenvs/letebo/lib/python2.6/site-packages/django/contrib/admin/options.py", line 677, in save_formset
formset.save()

File "/srv/.virtualenvs/letebo/lib/python2.6/site-packages/django/forms/models.py", line 482, in save
return self.save_existing_objects(commit) + self.save_new_objects(commit)

File "/srv/.virtualenvs/letebo/lib/python2.6/site-packages/django/forms/models.py", line 613, in save_new_objects
self.new_objects.append(self.save_new(form, commit=commit))

File "/srv/.virtualenvs/letebo/lib/python2.6/site-packages/django/forms/models.py", line 717, in save_new
obj.save()

File "/srv/.virtualenvs/letebo/lib/python2.6/site-packages/django/db/models/base.py", line 460, in save
self.save_base(using=using, force_insert=force_insert, force_update=force_update)

File "/srv/.virtualenvs/letebo/lib/python2.6/site-packages/django/db/models/base.py", line 504, in save_base
self.save_base(cls=parent, origin=org, using=using)

File "/srv/.virtualenvs/letebo/lib/python2.6/site-packages/django/db/models/base.py", line 543, in save_base
for f in meta.local_fields if not isinstance(f, AutoField)]

File "/srv/.virtualenvs/letebo/lib/python2.6/site-packages/django/db/models/fields/files.py", line 255, in pre_save
file.save(file.name, file, save=False)

File "/srv/.virtualenvs/letebo/lib/python2.6/site-packages/django/db/models/fields/files.py", line 92, in save
self.name = self.storage.save(name, content)

File "/srv/.virtualenvs/letebo/lib/python2.6/site-packages/django/core/files/storage.py", line 48, in save
name = self.get_available_name(name)

File "/srv/.virtualenvs/letebo/lib/python2.6/site-packages/django/core/files/storage.py", line 74, in get_available_name
while self.exists(name):

File "/srv/.virtualenvs/letebo/lib/python2.6/site-packages/django/core/files/storage.py", line 218, in exists
return os.path.exists(self.path(name))

File "/srv/.virtualenvs/letebo/lib/python2.6/genericpath.py", line 18, in exists
st = os.stat(path)

UnicodeEncodeError: 'ascii' codec can't encode characters in position 52-54: ordinal not in range(128)

Eu tentei executar o Gunicorn com a depuração ativada, e o arquivo é carregado sem nenhum problema. Suponho que isso deva significar que o problema está no Nginx. Ainda me bate onde procurar, no entanto. Aqui estão os cabeçalhos de resposta brutos de Gunicorn e Nginx, se fizer algum sentido:

Gunicorn:

HTTP/1.1 302 FOUND
Server: gunicorn/0.13.4
Date: Thu, 09 Feb 2012 14:50:27 GMT
Connection: close
Transfer-Encoding: chunked
Expires: Thu, 09 Feb 2012 14:50:27 GMT
Vary: Cookie
Last-Modified: Thu, 09 Feb 2012 14:50:27 GMT
Location: http://my-server.se:8000/admin/cms/page/15/
Cache-Control: max-age=0
Content-Type: text/html; charset=utf-8
Set-Cookie: messages="yada yada yada"; Path=/

Nginx:

HTTP/1.1 500 INTERNAL SERVER ERROR
Server: nginx/0.7.67
Date: Thu, 09 Feb 2012 14:50:57 GMT
Content-Type: text/html; charset=utf-8
Transfer-Encoding: chunked
Connection: close
Vary: Cookie

500

UPDATE : locale.getpreferredencoding() e sys.getfilesystemencoding() outputs 'UTF-8' . locale.getdefaultlocale() outputs ('sv_SE', 'UTF8') . Isso parece correto para mim, então ainda não sei por que continuo recebendo esses erros.

    
por Samuel Linde 14.02.2012 / 12:56

2 respostas

2

Eu tive o mesmo problema com genericpath.py dando um UnicodeEncodeError ao tentar carregar um nome de arquivo com caracteres não ASCII.

Eu estava usando o nginx, o uwsgi e o django com o python 2.7.

Tudo estava funcionando bem, mas não no servidor

Aqui estão os passos que dei 1. adicionado ao /etc/nginx/nginx.conf (não resolveu o problema)

http {
    charset utf-8;
}
  1. Eu adicionei esta linha a etc / default / locale (não consertei o problema)

LANGUAGE="en_US.UTF-8"

  1. Eu segui as instruções aqui listadas sob o título "Sucesso" link (não resolveu o problema)

    aptitude install language-pack-en-base
    
  2. Encontrado neste ingresso link que sugeriu testar uma visão no servidor para o que estava acontecendo com informações de localidade

Na sua opinião

import locale
locales = "Current locale: %s %s -- Default locale: %s %s" % (locale.getlocale() + locale.getdefaultlocale())

No seu modelo

{{ locales }}

Para mim, o problema é que eu não tinha código de idioma nem local padrão no meu servidor Ubuntu (apesar de tê-los em minha máquina dev local do OSX), então arquivos com nomes / caminhos de arquivos não ASCII não serão carregados corretamente com python levantando um UnicodeEncodeError, mas apenas no servidor de produção.

Solução

Adicionei isso ao meu site e ao meu site admin uwsgi config files por exemplo. / etc / uwsgi-emperor / vassals / arquivo my-site-config-ini

env = LANG=en_US.utf8
    
por 23.06.2015 / 13:14
0

Eu tive o mesmo problema e encontrei as correções para os meus casos (eu corro o Ubuntu).

Eu encontrei um bom tópico sem resposta aqui, onde Karen deu algumas informações úteis:

link

que me levou a isso:

link

Instalei o "pacote de idiomas" ausente para o Ubuntu. e eu corri em um shell como root:

locale-gen en_US.UTF-8

e agora está funcionando.

Parece que, em camadas de baixo nível do Python, algo chama o Glibc que precisa de alguns arquivos compilados gerados pelo locale-gen para funcionar corretamente.

Eu procurei no link e não há nenhum pacote como este no Debian.

Tente executar o seguinte e reinicie seu daemon antes de tentar novamente:

locale-gen sv_SE.UTF-8

ou talvez instale quaisquer pacotes de idioma / idioma específicos do Debian, se houver.

    
por 26.02.2012 / 19:39