繁体   English   中英

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

[英]UnicodeDecodeError in Django 1.6 static file server

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

根据您的错误消息,我的最佳猜测是您的Windows注册表中包含非ASCII字符,而mimetypes模块(Python标准库的一部分)中的某些内容对此造成了困扰。 我假设Django静态服务器或Django staticfiles应用本身正在调用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的错误。

  • 您可以尝试确切地找到1.5和1.6之间的哪些变化导致此问题,但这很可能是傻瓜的事,并且假设它不是Django中的彻底错误,最多只能导致您必须为您的补丁维护一个fork个人使用(不推荐)。

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

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

  • 最后,您可以尝试查找并修复实际的错误。 这是一个复杂的过程-您需要隔离该错误,查看是否需要在CPython标准库或Django(我怀疑是前者)中进行修复,向其中一个项目提交报告,然后编写补丁并提交或让其他人也这样做。 在提交并接受之前,从理论上讲,您可以使用已应用的修复程序来维护CPython的分支,但这是维护的噩梦。

我仍然有可能完全错误地指出原因,这不是mimetypes的错误-在这种情况下,您可能有更多选择。

非常不幸的是我也有这个问题。 我正在使用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及其多个包却有太多的错误内容,您只是不想浪费时间遍历每一个。

我有同样的问题。 今天,我只能使用Windows XP来访问计算机。 我调试了此错误,发现Windows注册表中的键值错误。 在我的情况下是:``BDATuner. ''。 我没有足够的时间来编辑注册表,所以我在enum_types中的第249行“文件D:\\ Python27 \\ lib \\ mimetypes.py”中临时添加了例外。

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

我解决了我的问题。

我知道用这种方式修补django代码是不好的,所以这只是解决方法。 正确的方法是摆脱错误的注册表值(regedit-下次搜索该值)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM