【问题标题】:UnicodeDecodeError in Django 1.6 static file serverDjango 1.6 静态文件服务器中的 UnicodeDecodeError
【发布时间】:2013-12-16 21:51:55
【问题描述】:

我最近将我的项目环境升级到了 django 1.6。升级后发现现有项目中的所有静态文件都不起作用了,即使按照教程新建一个项目,静态文件仍然不起作用。谁能帮帮我?

这是我的项目结构

    -mysite
        manage.py
        -mysite
            urls.py
            views.py
            settings.py
            __init__.py
            wsgi.py
            -static
                jqury.js

settings.py 看起来像这样

    INSTALLED_APPS = (
        ...
        'django.contrib.staticfiles',
    )

    TEMPLATE_DIRS = (
        os.path.join(BASE_DIR, 'WorldCup\\templates'),
    )

    TEMPLATE_CONTEXT_PROCESSORS = [
        'django.core.context_processors.static',
        'django.contrib.auth.context_processors.auth',
    ]

    STATIC_URL = '/static/'

    STATICFILES_DIRS = (
        os.path.join(BASE_DIR, 'WorldCup\\static'),
    )

    print STATICFILES_DIRS

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

我打印staticfiles_dirs,结果是('G:\django_project\mysite\mysite\static',),它正确指向我的静态文件夹。

html 文件如下所示:

    {% load staticfiles %}
    <script type="text/javascript" src="{% static "WorldCup/jquery-1.10.2.js" %}" 

    <body>
        hello world======{% static "WorldCup/jquery-1.10.2.js" %}=======
    </body>

页面显示"hello world======/static/jquery-1.10.2.js=======",看起来是正确的。

但控制台抱怨:

    Traceback (most recent call last):
    File "D:\Python27\lib\wsgiref\handlers.py", line 85, in run
       self.result = application(self.environ, self.start_response)
    File "D:\Python27\lib\site-packages\django\contrib\staticfiles\handlers.py", l
       ine 68, in __call__
    return super(StaticFilesHandler, self).__call__(environ, start_response)
    File "D:\Python27\lib\site-packages\django\core\handlers\wsgi.py", line 206, i
       n __call__
    response = self.get_response(request)
    File "D:\Python27\lib\site-packages\django\contrib\staticfiles\handlers.py", l
       ine 58, in get_response
    return self.serve(request)
    File "D:\Python27\lib\site-packages\django\contrib\staticfiles\handlers.py", l
       ine 51, in serve
    return serve(request, self.file_path(request.path), insecure=True)
    File "D:\Python27\lib\site-packages\django\contrib\staticfiles\views.py", line
       41, in serve
    return static.serve(request, path, document_root=document_root, **kwargs)
    File "D:\Python27\lib\site-packages\django\views\static.py", line 61, in serve

    content_type, encoding = mimetypes.guess_type(fullpath)
    File "D:\Python27\lib\mimetypes.py", line 297, in guess_type
       init()
    File "D:\Python27\lib\mimetypes.py", line 358, in init
       db.read_windows_registry()
    File "D:\Python27\lib\mimetypes.py", line 258, in read_windows_registry
       for subkeyname in enum_types(hkcr):
    File "D:\Python27\lib\mimetypes.py", line 249, in enum_types
       ctype = ctype.encode(default_encoding) # omit in 3.x!
    UnicodeDecodeError: 'ascii' codec can't decode byte 0xb9 in position 0: ordinal
       not in range(128)
    [01/Dec/2013 07:42:33] "GET /static/jquery-1.10.2.js HTTP/1.1" 500 59

即使我更改为图像文件而不是 js 文件,我仍然会收到这些错误....

【问题讨论】:

  • 静态文件的完整路径中是否可能包含非 ASCII 字符?
  • 你确定这是正确的路径吗?也许它实际上应该是G:\django_project\mysite\static(省略一个mysite)?
  • 其实我想知道您的 Windows 注册表中是否没有非 ASCII 字符!回溯似乎正在从中读取 mimetype 信息。我怀疑你发现了一个非常微妙的错误,它只发生在 Windows 上的 Python 2.x 中。
  • to yuvi:js文件的物理路径是“G:\django_project\mysite\mysite\static*.js”,我不认为问题出在这里
  • 致 Andrew Gorcester:我想问我如何查看我的窗口是否有 ASCII 字符?如果我没有 ASCII 字符,我该如何解决?

标签: django windows python-2.7 static-files


【解决方案1】:

根据您的错误消息,我的最佳猜测是您的 Windows 注册表中有非 ASCII 字符,而 mimetypes 模块(Python 标准库的一部分)中的某些内容令人窒息。我假设 Django 静态服务器或 Django 静态文件应用程序本身正在调用 mimetypes。

这不是您的系统本身的问题;如果我的诊断是正确的,那显然是 mimetypes 中的一个错误。

这里有一些选项:

  • 您可以升级到 Python 3.3 或 3.4 beta。 Django 1.6 与 Python 3 完全兼容,我会非常惊讶地看到 Py3 中仍然存在这个错误,因为 Py3 的明确目标之一是减少 unicode 编码/解码错误。

  • 您可以降级回 Django 1.5。

  • 您可以使用不同的操作系统进行开发工作。相对较少的 Python 程序员在 Windows 中进行他们的开发工作,尽管这个数字也不为零。如果您使用 OS X 或 Linux 进行开发工作,您就不太可能遇到极其隐蔽的错误。话虽如此,Windows 是官方支持的平台,所以如果 CPython 和 Windows 之间的交互出现问题,那就是 CPython 的 bug。

  • 1234563用你的补丁 fork 供你个人使用(不推荐)。
  • 您可以尝试在注册表中找到有问题的行并清除它,但我不知道您将如何处理。您可能有导致此问题的区域设置、Windows 的本地化版本、安装的非英语软件或自定义 MIME 类型的组合。由于这很可能是 mimetypes 库中的错误而不是您的系统的错误,因此您很容易发现注册表中的问题只是计算机某些正常功能的结果。

  • 1234563 Django 静态服务器并使用其他一些静态服务解决方案进行开发。这很不方便,但可能会起作用,只要问题仅出在 Django 静态服务器上。要进行测试,请将 DEBUG 设置为 False 或者关闭静态服务器并运行您的应用程序——如果它仍然崩溃,那么这不是 Django 静态服务器问题;否则,很可能是。
  • 最后,您可以尝试追踪实际的错误并修复它。这是一个复杂的过程——您需要隔离错误,查看是否需要在 CPython 标准库或 Django(我怀疑是前者)中修复它,向其中任何一个项目提交报告,然后编写补丁并提交或让其他人也这样做。在提交并接受之前,理论上您可以维护一个应用了修复程序的 CPython 分支,但这是维护的噩梦。

仍有可能我对原因完全错误,这不是mimetypes 中的错误——在这种情况下,您可能有更多选择。

【讨论】:

  • 感谢安德鲁·戈斯特。我不是母语人士,我的英语不是很好,但我真的很感谢你的帮助,我会尝试使用 python 3.3 和 django 1.6。
【解决方案2】:

很不幸我也有这个问题。我使用的是 python 3.3,一切正常。但是由于我的生产端运行的是python 2.7,所以我用python 2.7.6创建了一个virtualenv,然后安装了South,调试工具栏,和我的Python3.3环境一样。但它根本不适用于 python2.7 virtualenv。我的 Django 版本是 1.6。所以我解决这个问题的简单方法是切换回我的python3.3。

有关更多详细信息,我的猜测是相关模型/数据库出现问题。我记得在我的virtualenv python2.7版本中进行数据库迁移后,出现了这个问题,而在此之前一切顺利。

所以我建议您使用 Python3.3 运行 virtualenv,并在您有更多时间时调试旧问题。无论如何,首先要节省时间。我发现 Django 确实是一个不错的框架,但是带有多个包的 Python 有太多错误的东西,你只是不想浪费时间去检查每一个。

【讨论】:

    【解决方案3】:

    我也有同样的问题。 今天我只能用windows XP访问机器。 我已调试此错误并发现,Windows 注册表中的该键值不正确。 就我而言,它是:'BDATuner.����������'。 我没有足够的时间来编辑注册表,所以我临时将异常添加到文件“D:\Python27\lib\mimetypes.py”,第 249 行,在 enum_types

                try:
                    ctype = ctype.encode(default_encoding) # omit in 3.x!
                except UnicodeEncodeError, UnicodeDecodeError:
                    pass
                else:
                    yield ctype
    

    我解决了我的问题。

    我知道以这种方式修补 django 代码很糟糕,所以它只是一种解决方法。 正确的方法是去掉错误的注册表值(regedit - 下一次搜索这个值)。

    【讨论】:

      猜你喜欢
      • 2014-03-20
      • 2013-11-22
      • 2013-11-29
      • 2013-12-08
      • 2014-02-26
      • 2014-01-17
      • 2019-11-17
      • 1970-01-01
      • 2019-08-29
      相关资源
      最近更新 更多