2012-02-09 31 views
6

Câu hỏi của tôi tương tự như câu hỏi được báo cáo here, nhưng giải pháp được đề xuất không hoạt động đối với tôi. Tôi đang cố tải lên một tệp có tên 'Testaråäö.txt' thông qua ứng dụng quản trị Django.UnicodeEncodeError khi tải lên tệp trong quản trị Django

Tôi đang chạy Django 1.3.1 với Gunicorn 0.13.4 và Nginx 0.7.6.7 trên máy chủ Debian 6. Cơ sở dữ liệu là PostgreSQL 8.4.9. Các dữ liệu Unicode khác được lưu vào cơ sở dữ liệu mà không có vấn đề gì, vì vậy tôi đoán vấn đề phải ở trong hệ thống tập tin bằng cách nào đó.

tôi đã thiết

http { 
    charset utf-8; 
} 

trong nginx.conf tôi. LC_ALL và LANG được đặt thành 'sv_SE.UTF-8'. Chạy 'locale' xác minh điều này. Tôi thậm chí đã cố gắng thiết lập LC_ALL và LANG trong init script nginx của tôi chỉ để đảm bảo locale được thiết lập đúng.

Đây là 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) 

UPDATE: Tôi cố gắng chạy Gunicorn với gỡ lỗi bật, và các tập tin tải lên mà không cần bất kỳ vấn đề gì cả. Tôi cho rằng điều này có nghĩa là vấn đề là với Nginx. Tuy nhiên, tôi vẫn đánh bại tôi. Dưới đây là các tiêu đề phản ứng thô từ Gunicorn và Nginx, nếu nó làm cho bất kỳ ý nghĩa:

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

bạn đã bao giờ có được một sửa chữa cho điều này? làm thế nào bạn bắt đầu gunicorn? – ashwoods

+0

Xin lỗi, không. Tôi nói với khách hàng của tôi chỉ đơn giản là tránh sử dụng các ký tự unicode cho đến khi tôi có thể tìm thấy một giải pháp (mà nhiều hơn và nhiều hơn nữa trông giống như di chuyển đến một máy chủ khác nhau). Tôi đang sử dụng Supervisor để bắt đầu gunicorn. –

+0

Điều này cũng xảy ra với chúng tôi. Cùng một thiết lập - NginX, Giám sát viên, Gunicorn chạy ứng dụng Django.Tôi đã lãng phí hai giờ cố gắng để sửa chữa nó, đã thử tất cả các khuyến nghị ở khắp mọi nơi trên internet mà không có bất kỳ may mắn. Hy vọng rằng, ai đó sẽ tìm cách để làm việc này sau cùng. – xaralis

Trả lời

6

Dường như đó là một vấn đề phổ biến mà các dịch vụ chạy dịch vụ django, có thể là apache, gunicorn + supervisor, daemontools, v.v. không phải lúc nào cũng sử dụng các biến môi trường chính xác.

Trong trường hợp này, gunicorn được bắt đầu bởi người giám sát, vì vậy bạn phải nói rõ ràng giám sát sử dụng utf-8 sử dụng tùy chọn môi trường:

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

Dường như trong Trình giám sát 3.0a8 (phiên bản được cung cấp trong Debian Bóp) tùy chọn 'môi trường' phải được chỉ định chung trong phần' [giám sát] 'của tệp cấu hình. Nó không được nhận diện trong các phần '[program: *]'. – akaihola

+0

akaihola cảm ơn, tôi đã dành 3 giờ đồng hồ để tìm kiếm điều đó ..... – migajek

+0

cảm ơn bạn, điều này đã làm việc rất tốt. – Marco

1

tôi đã cùng một vấn đề với genericpath.py đưa ra một UnicodeEncodeError khi cố tải lên tên tệp có ký tự không phải ASCII.

Tôi đã sử dụng nginx, uwsgi và django với python 2.7.

Mọi thứ đã được làm việc OK tại địa phương nhưng không phải trên máy chủ

Dưới đây là các bước tôi đã:

  1. thêm vào/etc/nginx/nginx.conf (không khắc phục được vấn đề)

    http { 
        charset utf-8; 
    } 
    
  2. tôi đã thêm dòng này để etc/default/locale (không khắc phục được vấn đề)

    LANGUAGE="en_US.UTF-8" 
    
  3. Tôi làm theo các hướng dẫn tại đây được liệt kê dưới tiêu đề 'thành công' https://code.djangoproject.com/wiki/ExpectedTestFailures (không khắc phục được vấn đề)

    aptitude install language-pack-en-base 
    
  4. Tìm thấy trên vé này https://code.djangoproject.com/ticket/17816 mà đề nghị thử nghiệm một cái nhìn trên máy chủ với những gì đã xảy ra với các thông tin locale

Django xem

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> 

Đối với tôi, vấn đề này là Tôi không có miền địa phương và không có miền địa phương mặc định trên máy chủ Ubuntu của tôi (mặc dù tôi đã có chúng trên máy dev OSX cục bộ của tôi), sau đó các tệp không có tệp ASCII tên/đường dẫn sẽ không tải lên chính xác với python nâng UnicodeEncodeError, nhưng chỉ trên máy chủ sản xuất.

Giải pháp

tôi thêm này để cả hai trang web của tôi và site admin uwsgi file config của tôi ví dụ/Etc/uwsgi-hoàng đế/chư hầu/my-site-config-ini tập tin

env = LANG=en_US.utf8 

Cập nhật

Sau khi chuyển giao cho Docker tôi bắt đầu nhận được các lỗi tương tự một lần nữa. Sau khi nhìn vào nó hơn nữa tôi nhận ra trong ví dụ uwsgi django import sys; sys.getfilesystemencoding() hoặc {{ file_system_encoding }} ở trên đã trở về ANSI_X3.4-1968, tuy nhiên nếu tôi bắt đầu cá thể python của riêng tôi và chạy import sys; sys.getfilesystemencoding() tôi sẽ nhận được UTF-8. Định dạng ANSI_X3.4-1968 là cái đang ném UnicodeEncodeError.

Vì vậy, ngoài các giải pháp uwsgi liệt kê trong câu trả lời này ở trên, tôi cũng đã có để thêm video này Django tôi dockerfile

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 

Hoặc nếu bạn không sử dụng Docker bạn chỉ có thể chạy trong vỏ

$ export LANG=en_US.UTF-8 

Sau đó chạy lệnh RUN ở trên (nhưng không có RUN).

Tài liệu tham khảo:

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

Đây là một câu trả lời tuyệt vời, với hướng dẫn chẩn đoán từng bước. Tôi không biết tại sao nó có quá ít phiếu bầu. Xin lưu ý rằng trong trường hợp của Ubuntu bạn cần một gói ngôn ngữ cho ngôn ngữ của bạn. Vì vậy, nếu đặt 'LANG' env để chúng ta hãy nói tiếng Tây Ban Nha, bạn nead' aptitude install language-pack-es-base'. Tương tự cho tất cả các ngôn ngữ khác. –

Các vấn đề liên quan