【问题标题】:Decoding error in django filebrowser 3.2 on linuxlinux上django filebrowser 3.2中的解码错误
【发布时间】:2011-07-20 17:18:35
【问题描述】:

错误信息:

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)

如您所见,一切都在 shell 中运行,但在 django 文件浏览器中却没有。

【问题讨论】:

    标签: python django django-filebrowser


    【解决方案1】:

    从查看文档看来,FileBrowser 仅支持 ASCII

    它在异常中说:

    Exception Value: 'ascii' codec can't decode byte 0xc3 in position 3: ordinal not in range(128)

    os.path.join(file_dir, file) 正在获取一个 Unicode 字符串,并且它被隐式编码为 ASCII,而不是 UTF-8。在 Python 3 中对 unicode / string 进行了更改以消除此问题。

    在某处,file_dir 需要用file_dir.encode('utf-8') 编码。作为使其工作的坏技巧,您可以尝试在第 99 行的 /web/hvita_perlan/lib/python2.6/site-packages/filebrowser/views.py 中进行操作:

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

    然后进行测试,并在每次在 FileBrowser 中找到触发此错误的新位置时重复。

    【讨论】:

    • 我做了一些研究,在我看来文件浏览器应该支持 utf-8。您建议的 hack 并没有解决问题的根源。我觉得必须有一个更简单的解决方案。我之前在另一台服务器上设置了同一个站点,它在那里工作。
    • 请参阅code.google.com/p/django-filebrowser/issues/detail?id=57code.djangoproject.com/ticket/10241。两者都表明非 ASCII 字符可以破坏 FileBrowser。您之前很幸运,没有遇到错误。此外,如果文档根本没有提到 Unicode、编码或解码,那么程序不支持 Unicode。
    【解决方案2】:

    在 django-filebrowser 3.5.6 中有一个设置 FILEBROWSER_NORMALIZE_FILENAME 如果在 settings.py 中设置为 true,它将使 fb 从文件名中去除非标准字符。 我很难找到有关它的信息,因此即使不确定它是否适用于旧版本,也将其发布在这里。

    【讨论】:

      【解决方案3】:

      解决办法在这里: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 -*-
      

      【讨论】:

      • 如果文件名使用的编码不是utf-8,则标头无法解决问题。 Unicode 支持意味着如果以 Python 理解的 any 编码传递文件名,它将起作用。
      • 是的,这很好。我想人们也必须能够使用其他编码。
      • 它确实帮助了我,但我认为这不是正确的答案。所以现在就一个,我会考虑一下。 ;)
      【解决方案4】:

      这是一个旧帖子,但问题仍然存在。
      我正在使用 django、apache2、django-filebrowser 并获取此异常值:'ascii' codec can't decode byte 0xc3 in position...

      即使使用 mod_wsgi 也对我有用。

      #https://docs.djangoproject.com/en/1.2/howto/deployment/modpython/#if-you-get-a-unicodeencodeerror
      #Put this in your apache2/envvars file.
      
      export LANG='en_US.UTF-8'
      export LC_ALL='en_US.UTF-8'
      

      希望它可以帮助某人。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-10-12
        • 2011-09-02
        • 2012-08-28
        • 2011-02-13
        • 1970-01-01
        • 2016-02-05
        • 1970-01-01
        • 2017-03-19
        相关资源
        最近更新 更多