Django 1.6静态文件服务器中的UnicodeDecodeError

时间:2013-11-30 23:56:35

标签: django windows python-2.7 static-files

我最近将我的项目环境升级到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文件,我仍然会收到这些错误....

3 个答案:

答案 0 :(得分:1)

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

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

以下是一些选项:

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

  • 您可以降级回Django 1.5。

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

  • 您可以尝试确切地找到1.5和1.6之间的变化导致了这个问题,但这可能是一个傻瓜的差事,并且假设它不是Django中的彻头彻尾的错误,最多会导致您必须维护用你的补丁分叉供你个人使用(不推荐)。

  • 您可以尝试在注册表中找到有问题的行并清理它,但我不知道您将如何执行此操作。您可能具有区域设置,Windows的本地化版本,非英语安装的软件或导致此问题的自定义MIME类型的组合。由于它似乎是mimetypes库中的一个错误,而不是系统的错误,因此您很容易发现注册表中的问题只是计算机某些正常功能的结果。

  • 如果问题出在Django静态服务器上的方式不会影响生产中的应用程序(Django静态服务器,只适合开发,可能会被禁用),那么你可以禁用Django静态服务器并使用一些其他静态服务解决方案进行开发。这很不方便,但可能会有效,只要问题只在于Django静态服务器。要测试,将DEBUG设置为False或以其他方式关闭静态服务器并运行您的应用程序 - 如果它仍然崩溃,那么它不是Django静态服务器问题;否则,可能是。

  • 最后,您可以尝试追踪实际的错误并进行修复。这是一个复杂的过程 - 你需要隔离bug,看看它是否需要在CPython标准库或Django中修复(我怀疑前者),用这些项目中的任何一个提交报告,然后写一个补丁并提交或让其他人也这样做。在提交和接受之前,理论上你可以在应用修复的情况下维护CPython的分支,但这是一个维护噩梦。

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

答案 1 :(得分:0)

非常不幸的是我也有这个问题。我使用的是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及其多个软件包只有太多错误的东西,你只是不想浪费你的时间去浏览它们中的每一个。

答案 2 :(得分:0)

我有同样的问题。 今天我只能访问带有Windows XP的机器。 我调试了这个错误,发现Windows注册表中的密钥值不好。 就我而言,它是:&#39;BDATuner.���������&#39;。 我没有时间编辑注册表,所以我临时在文件&#34; D:\ Python27 \ lib \ mimetypes.py&#34;,第249行,在enum_types中添加例外

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

我解决了我的问题。

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