2012-02-09 21 views
6

Benim sorum here bildirilene benzer, ancak önerilen çözüm benim için çalışmıyor. Django admin uygulaması aracılığıyla 'Testaråäö.txt' adlı bir dosya yüklemeye çalışıyorum.UnicodeEncodeError Django admin içindeki dosyaları yüklerken admin olarak ara

Django 1.3.1'i bir Debian 6 sunucusunda Gunicorn 0.13.4 ve Nginx 0.7.6.7 ile çalıştırıyorum. Veritabanı PostgreSQL 8.4.9. Diğer Unicode verileri herhangi bir sorun olmadan veritabanına kaydedilir, bu yüzden problemin dosya sistemiyle bir şekilde olması gerekir.

benim nginx.conf içinde

http { 
    charset utf-8; 
} 

kurdum. LC_ALL ve LANG, 'sv_SE.UTF-8' olarak ayarlandı. 'Locale' çalıştırmak bunu doğrular. Yerel ayarın doğru şekilde ayarlandığından emin olmak için nginx init betiğimde LC_ALL ve LANG ayarlamayı bile denedim.

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) 

GÜNCELLEME:

İşte traceback var Ben açık ayıklamaya Gunicorn çalışan çalıştı ve hiç bir sorun olmadan dosya yükleme. Sanırım bu sorunun Nginx ile olduğu anlamına geliyor. Yine de bana bakmam gereken yere atıyor.

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: herhangi mantıklı olmadığı İşte Gunicorn ve Nginx, ham yanıt başlıkları şunlardır

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 
+0

Hiç bunun için bir düzeltme elde ettiniz? Silahçılığa nasıl başlıyorsun? – ashwoods

+0

Üzgünüm, hayır. İstemciye, bir çözüm bulabilene kadar (başka bir sunucuya geçiş gibi görünen) unicode karakterleri kullanmaktan kaçınmamı söyledim. Silahçığı başlatmak için Amiri kullanıyorum. –

+0

Bu bizim için de geçerli. Aynı kurulum - Django uygulamasını çalıştıran NginX, Supervisor, Gunicorn.Düzeltmek için iki saatimi harcadım, internet üzerinden her yerde tüm önerileri denemeden denedim. İnşallah, birisi sonunda bu çalışmayı elde etmenin bir yolunu bulacak. – xaralis

cevap

6

O hizmeti olduğu ortak bir sorun olduğunu görünüyor django hizmetini çalıştırır, apache, gunicorn + amiri, daemontools vb. her zaman doğru ortam değişkenlerini kullanmaz. Bu durumda

, gunicorn amir tarafından başlatılır, böylece açıkça çevre seçeneğini kullanarak utf-8 kullanmak amire anlatmak zorunda:

environment=LANG=en_US.UTF-8, LC_ALL=en_US.UTF-8, LC_LANG=en_US.UTF-8 
+2

Süpervizör 3.0a8'de (Debian Sıkıştırması'nda sağlanan sürüm) göründüğü gibi, 'environment' seçeneği, yapılandırma dosyasının '[süpervizörü]' bölümünde global olarak belirtilmelidir. [Program: *] bölümlerinde tanınmıyor. – akaihola

+0

akaihola teşekkürler, ben son 3 saat bunu bekledim ..... – migajek

+0

teşekkürler, bu harika çalıştı. – Marco

1

Ben genericpath.py bir UnicodeEncodeError vererek aynı sorunu vardı ASCII olmayan karakterler içeren bir dosya adı yüklemeye çalışırken.

python 2.7 ile nginx, uwsgi ve django kullanıyordum.

  1. /etc/nginx/nginx eklendi:

    Her şey sunucusunda yerel olarak değil normal çalışıyorken

    İşte aldı adımlardır.conf ben etc/default/locale bu satırı eklendi

    http { 
        charset utf-8; 
    } 
    
  2. (sorunu çözmek vermedi) (didnt'saptamak sorun)

    LANGUAGE="en_US.UTF-8" 
    
  3. Burada başlığı altında listelenen talimatları takip 'Başarı' https://code.djangoproject.com/wiki/ExpectedTestFailures bu biletkarşısında

    aptitude install language-pack-en-base 
    
  4. Bulunan (sorunu çözmedi sorun) Benim için yerel bilgi

Django görünümü ile

import locale 

def locales(request): 
    """Display the locales""" 
    locales = "Current locale: %s %s -- Default locale: %s %s" % (
     locale.getlocale() + locale.getdefaultlocale()) 
    default_encoding = sys.getdefaultencoding() 
    file_system_encoding = sys.getfilesystemencoding() 

    context = { 
     'locales': locales, 
     'default_encoding': default_encoding, 
     'file_system_encoding': file_system_encoding, # affects file uploads 
    } 
    return render(request, 'testing/locales.html', context) 

Django Template

<h2>Locales</h2> 
<p>{{ locales }}</p> 

<h2>Default Encoding</h2> 
<p>{{ default_encoding }}</p> 

<h2>File System Encoding</h2> 
<p>{{ file_system_encoding }}</p> 

ne olup bittiğini sunucuda bir görünüm test önerdihttps://code.djangoproject.com/ticket/17816 , konu olmasıydı Ubuntu sunucumda hiçbir yerel ayar ve varsayılan yerel ayar yoktu (onları yerel OSX dev makinesinde yaptım) ancak ASCII olmayan dosyalar ad/yollar, UnicodeEncodeError'ı yükselterek, yalnızca üretim sunucusunda python ile doğru şekilde yüklenmez.

Çözüm

siteme ve benim site yöneticisi uwsgi yapılandırma dosyalarının örneğin hem bu katma/Etc/uwsgi-imparator/vasaller/my-sitesi-config-ini dosyası

env = LANG=en_US.utf8 

Güncelleme

liman işçisi yanına taşındıktan sonra tekrar aynı hatayı alıyorum başladı. Uwsgi django örneğinde import sys; sys.getfilesystemencoding() veya {{ file_system_encoding }} yukarıda ANSI_X3.4-1968'i döndürdüğümüzü farkettikten sonra, kendi python örneğimi başlatırsam ve import sys; sys.getfilesystemencoding()'u çalıştırırsam UTF-8 alırdım. ANSI_X3.4-1968 biçimi, UnicodeEncodeError öğesinin ne yazdığıdır.

Yani yukarıda bu cevap listelenen uwsgi çözümüne ek olarak, ben de

ENV LANG en_US.UTF-8 
RUN apt-get update && install -y locales && \ 
    sed -i -e "s/# $LANG.*/$LANG UTF-8/" /etc/locale.gen && \ 
    locale-gen --purge &&\ 
    update-locale LANG=$LANG 

dockerfile benim Django'ya bu eklemek zorunda Yoksa liman işçisi kullanmıyorsanız sadece kabukta bu çalıştırabilirsiniz Daha sonra yukarıdaki RUN komutunu (ancak RUN olmadan) çalıştırın.

Referanslar:

http://stackoverflow.com/a/37246853/3003438 
https://docs.djangoproject.com/en/dev/howto/deployment/wsgi/uwsgi/ 
+0

Bu, adım adım tanılama kılavuzu ile harika bir yanıttır. Neden bu kadar az oyu olduğunu bilmiyorum. Ubuntu’da diliniz için bir dil paketine ihtiyacınız olduğunu lütfen unutmayın. Yani, 'LANG' env' ini ispanyolca söylesin, 'aptitude install language-pack-es-base'. Diğer tüm diller için de benzer. –