Django:执行命令collectstatic引发UnicodeDecodeError

时间:2012-08-11 14:16:57

标签: python django apache static

为什么要提出UnicodeDecodeError? 我尝试使用apache部署我的django应用程序 复制静态文件,输入

$python manage.py collectstatic

我收到如下错误消息。

You have requested to collect static files at the destination
location as specified in your settings.

This will overwrite existing files!
Are you sure you want to do this?

Type 'yes' to continue, or 'no' to cancel: yes
Traceback (most recent call last):
File "manage.py", line 10, in <module>
execute_from_command_line(sys.argv)
File "/usr/local/lib/python2.7/dist-packages/django/core/management/__init__.py", line 443, in execute_from_command_line
utility.execute()
File "/usr/local/lib/python2.7/dist-packages/django/core/management/__init__.py", line 382, in execute
self.fetch_command(subcommand).run_from_argv(self.argv)
File "/usr/local/lib/python2.7/dist-packages/django/core/management/base.py", line 196, in run_from_argv
self.execute(*args, **options.__dict__)
File "/usr/local/lib/python2.7/dist-packages/django/core/management/base.py", line 232, in execute
output = self.handle(*args, **options)
File "/usr/local/lib/python2.7/dist-packages/django/core/management/base.py", line 371, in handle
return self.handle_noargs(**options)
File "/usr/local/lib/python2.7/dist-packages/django/contrib/staticfiles/management/commands/collectstatic.py", line 163, in handle_noargs
collected = self.collect()
File "/usr/local/lib/python2.7/dist-packages/django/contrib/staticfiles/management/commands/collectstatic.py", line 104, in collect
for path, storage in finder.list(self.ignore_patterns):
File "/usr/local/lib/python2.7/dist-packages/django/contrib/staticfiles/finders.py", line 137, in list
for path in utils.get_files(storage, ignore_patterns):
File "/usr/local/lib/python2.7/dist-packages/django/contrib/staticfiles/utils.py", line 37, in get_files
for fn in get_files(storage, ignore_patterns, dir):
File "/usr/local/lib/python2.7/dist-packages/django/contrib/staticfiles/utils.py", line 37, in get_files
for fn in get_files(storage, ignore_patterns, dir):
File "/usr/local/lib/python2.7/dist-packages/django/contrib/staticfiles/utils.py", line 25, in get_files
directories, files = storage.listdir(location)
File "/usr/local/lib/python2.7/dist-packages/django/core/files/storage.py", line 236, in listdir
if os.path.isdir(os.path.join(path, entry)):
File "/usr/lib/python2.7/posixpath.py", line 71, in join
path += '/' + b
UnicodeDecodeError: 'ascii' codec can't decode byte 0xba in position 1: ordinal not in range(128)

我的静态文件出了什么问题? 我的settings.py

import os
PROJECT_ROOT = os.path.dirname(__file__)
STATIC_ROOT = os.path.join(PROJECT_ROOT, 'static/')
# URL prefix for static files.
# Example: "http://media.lawrence.com/static/"
STATIC_URL = '/static/'


STATICFILES_FINDERS = (
'django.contrib.staticfiles.finders.FileSystemFinder',
'django.contrib.staticfiles.finders.AppDirectoriesFinder',
#    'django.contrib.staticfiles.finders.DefaultStorageFinder',
)

和apache host conf

ServerName www.abcd.org
DocumentRoot /srv/www/yyy

<Directory /srv/www/yyy>
    Order allow,deny 
    Allow from all 
</Directory>

WSGIDaemonProcess yyy.djangoserver processes=2 threads=15 display-name=%{GROUP}
WSGIProcessGroup iii.djangoserver

WSGIScriptAlias / /srv/www/yyy/apache/django.wsgi

2 个答案:

答案 0 :(得分:3)

看起来要复制的静态文件的一个或多个路径包含非ASCII字符。

它与desctination目录的路径无关。

找出的一种方法是来放

try:
    print path
except:
    pass
try:
    print entry
except:
    pass  

在/usr/local/lib/python2.7/dist-packages/django/core/files/storage.py中的第236行之前,然后再次运行manage.py。

然后你应该看到问题发生的地方(你不会看到罪魁祸首,但是文件就在它之前,并且可能是问题文件的目录)。

或者,您也可以使用pdb

python -m pdb manage.py collectstatic

并在调试器中检查导致问题的文件。

答案 1 :(得分:0)

当我在docker容器中使用 django-pipeline 时,我遇到了同样的错误。事实证明,由于某种原因,系统使用POSIX语言环境。我使用了此处提出的解决方案并在系统shell中导出了语言环境设置:

export LC_ALL=en_US.UTF-8
export LANG=en_US.UTF-8

您可以检查以后您的语言环境应该是:

vagrant@vagrant-ubuntu-trusty-64:/project$ locale
LANG=en_US.UTF-8
LANGUAGE=
LC_CTYPE="en_US.UTF-8"
LC_NUMERIC="en_US.UTF-8"
LC_TIME="en_US.UTF-8"
LC_COLLATE="en_US.UTF-8"
LC_MONETARY="en_US.UTF-8"
LC_MESSAGES="en_US.UTF-8"
LC_PAPER="en_US.UTF-8"
LC_NAME="en_US.UTF-8"
LC_ADDRESS="en_US.UTF-8"
LC_TELEPHONE="en_US.UTF-8"
LC_MEASUREMENT="en_US.UTF-8"
LC_IDENTIFICATION="en_US.UTF-8"
LC_ALL=en_US.UTF-8

效果很好。另外,请注意我在docker和外部机器上都这样做了。