升级到django rest framework 3后出现UnicodeDecodeError
在django rest框架2下,以下功能可以正常工作:升级到django rest framework 3后出现UnicodeDecodeError,django,django-rest-framework,Django,Django Rest Framework,在django rest框架2下,以下功能可以正常工作: from rest_framework import rest_response, generics from rest_framework.renderers import JSONRenderer, BrowsableAPIRenderer class SomeView(generics.GenericAPIView): renderer_classes = JSONRenderer, BrowsableAPIRendere
from rest_framework import rest_response, generics
from rest_framework.renderers import JSONRenderer, BrowsableAPIRenderer
class SomeView(generics.GenericAPIView):
renderer_classes = JSONRenderer, BrowsableAPIRenderer
def get(self, request, *args, **kwargs):
...
# Build a response dict with non-ascii in it
...
return rest_response.Response(some_dict_with_non_ascii_in_it_somewhere)
我没有显式编码任何非ascii
但是,升级到DRF 3后,相同的代码现在会抛出以下错误:
Traceback (most recent call last):
File "/Users/troy/.virtualenvs/publisher/lib/python2.7/site-packages/django/contrib/staticfiles/handlers.py", line 63, in __call__
return self.application(environ, start_response)
File "/Users/troy/.virtualenvs/publisher/lib/python2.7/site-packages/whitenoise/base.py", line 119, in __call__
return self.application(environ, start_response)
File "/Users/troy/.virtualenvs/publisher/lib/python2.7/site-packages/django/core/handlers/wsgi.py", line 189, in __call__
response = self.get_response(request)
File "/Users/troy/.virtualenvs/publisher/lib/python2.7/site-packages/django/core/handlers/base.py", line 218, in get_response
response = self.handle_uncaught_exception(request, resolver, sys.exc_info())
File "/Users/troy/.virtualenvs/publisher/lib/python2.7/site-packages/django/core/handlers/base.py", line 261, in handle_uncaught_exception
return debug.technical_500_response(request, *exc_info)
File "/Users/troy/.virtualenvs/publisher/lib/python2.7/site-packages/django_extensions/management/technical_response.py", line 5, in null_technical_500_response
six.reraise(exc_type, exc_value, tb)
File "/Users/troy/.virtualenvs/publisher/lib/python2.7/site-packages/django/core/handlers/base.py", line 164, in get_response
response = response.render()
File "/Users/troy/.virtualenvs/publisher/lib/python2.7/site-packages/django/template/response.py", line 158, in render
self.content = self.rendered_content
File "/Users/troy/.virtualenvs/publisher/lib/python2.7/site-packages/rest_framework/response.py", line 71, in rendered_content
ret = renderer.render(self.data, media_type, context)
File "/Users/troy/.virtualenvs/publisher/lib/python2.7/site-packages/rest_framework/renderers.py", line 104, in render
separators=separators
File "/usr/local/Cellar/python/2.7.6/Frameworks/Python.framework/Versions/2.7/lib/python2.7/json/__init__.py", line 250, in dumps
sort_keys=sort_keys, **kw).encode(obj)
File "/usr/local/Cellar/python/2.7.6/Frameworks/Python.framework/Versions/2.7/lib/python2.7/json/encoder.py", line 210, in encode
return ''.join(chunks)
UnicodeDecodeError: 'ascii' codec can't decode byte 0xc3 in position 671: ordinal not in range(128)
我猜DRF3现在有了一些新的配置值,在某些地方,这是DRF2下的默认值。我已经尝试将REST\u FRAMEWORKUNICODE\u JSON
设置为True
,但仍然得到相同的错误
是否有一个设置可以使该部件像DRF2那样工作?或者DRF 3需要我在字典中搜索非ASCII字符并手动编码它?默认情况下Python 2.7认为字符串是二进制的。 尝试在文件顶部添加:
from __future__ import unicode_literals
这将使您的字符串默认为unicode,并有助于正确转换它们。我找到了答案
在DRF2中,rest\u framework.JSONRenderer。确保将\u ascii
设置为True
。在DRF 3中,rest\u framework.JSONRenderer。确保将\u ascii
设置为not api\u settings.UNICODE\u JSON
(我在前面写问题时错过了not
)
因此,为了让它像DRF2一样工作,我需要将“UNICODE_JSON”设置为False
,而不是True
,就像我以前尝试过的那样(默认情况下为True):
或者,我当然可以对字典中的值进行编码,这在很多情况下可能是更好的选择。谢谢。我尝试了一下,虽然它确实做到了所有相关字符串现在都是dict中的unicode,但处理响应对象并将dict转换为字符串的库代码没有那个import语句,所以在执行
'.join()
…之前,东西会被转换回unicode和常规字符串的混合体。。。
REST_FRAMEWORK = {
...
'UNICODE_JSON': False
}