Linux 上 django filebrowser 3.2 解码错误

2 投票
4 回答
1998 浏览
提问于 2025-04-16 21:56

错误信息:

Traceback:
File "/web/hvita_perlan/lib/python2.6/site-packages/django/core/handlers/base.py" in get_response
  111.                         response = callback(request, *callback_args, **callback_kwargs)
File "/web/hvita_perlan/lib/python2.6/site-packages/django/contrib/admin/views/decorators.py" in _checklogin
  19.             return view_func(request, *args, **kwargs)
File "/web/hvita_perlan/lib/python2.6/site-packages/django/views/decorators/cache.py" in _wrapped_view_func
  79.         response = view_func(request, *args, **kwargs)
File "/web/hvita_perlan/lib/python2.6/site-packages/filebrowser/views.py" in browse
  99.         fileobject = FileObject(os.path.join(file_dir, file))
File "/web/hvita_perlan/lib/python2.6/posixpath.py" in join
  70.             path += '/' + b

Exception Type: UnicodeDecodeError at /admin/filebrowser/browse/
Exception Value: 'ascii' codec can't decode byte 0xc3 in position 3: ordinal not in range(128)

无法编码/解码的字符串是:/1h����.j

这个文件的真实文件名是:1hæð.jpg

一些信息:

> locale
LANG=en_GB.UTF-8

-

> python manage.py shell
>>> import locale
>>> locale.getlocale()
('en_GB', 'UTF8')

>>> import os
>>> os.stat('../uploads/_promotional/1hæð_fb_thumb.jpg')
posix.stat_result(st_mode=33279, st_ino=788504L, st_dev=51713L, st_nlink=1, st_uid=0, st_gid=0, st_size=1629L, st_atime=1311176542, st_mtime=1311176542, st_ctime=1311177235)

正如你所看到的,在命令行中一切正常,但在Django文件浏览器中却不行。

4 个回答

1

在django-filebrowser 3.5.6版本中,有一个设置叫做 FILEBROWSER_NORMALIZE_FILENAME。如果你在settings.py文件中把它设置为true,它会让文件浏览器自动去掉文件名中的一些不标准的字符。我找了很久都没找到相关的信息,所以在这里分享一下,虽然我不确定这个设置在旧版本中是否也有效。

1

从文档来看,FileBrowser 只支持 ASCII 字符

在错误提示中,它说:

异常值: 'ascii' 编码无法解码位置 3 的字节 0xc3: 序号不在范围内(128)

os.path.join(file_dir, file) 正在获取一个 Unicode 字符串,但它被隐式地编码成了 ASCII,而不是 UTF-8。Python 3 对 Unicode 和字符串的处理做了一些改动,以解决这个问题。

在某个地方,file_dir 需要用 file_dir.encode('utf-8') 来编码。作为一个临时的解决办法,你可以尝试在 /web/hvita_perlan/lib/python2.6/site-packages/filebrowser/views.py 的第 99 行进行修改:

fileobject = FileObject(os.path.join(file_dir.encode('utf-8'), file))

然后测试一下,每次在 FileBrowser 中找到触发这个错误的新地方时,就重复这个过程。

0

解决方案在这里:http://diveintopython.net/xml_processing/unicode.html

我通过把sitecustomize.py文件添加到lib/python2.6/目录下解决了这个问题。

# sitecustomize.py                   
# this file can be anywhere in your Python path,
# but it usually goes in ${pythondir}/lib/site-packages/
import sys
sys.setdefaultencoding('utf-8')

文件浏览器的文件没有utf-8的头部信息。我觉得他们应该改一下这个。 它的样子是这样的:

#!/usr/bin/env python
# -*- coding: UTF-8 -*-

撰写回答