我最近将我的项目环境升级到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文件,我仍然会收到这些错误....
答案 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 - 下次搜索这个值)。