2016-01-29 13 views
6

Pod Django Rest-ram 2 dodaje działa dobrze:UnicodeDecodeError po uaktualnieniu do Django Rest-ram 3

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) 

nie trzeba jawnie zakodować dowolny nie-ASCII ...

jednak po uaktualnieniu do DRF 3, ten sam kod teraz rzuca się następujący błąd:

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) 

Zgaduję DRF 3 teraz jest jakaś nowa wartość config, gdzieś, że był domyślnym pod DRF 2. I próbowałem uspokajania g ustawienie do True REST_FRAMEWORK UNICODE_JSON, ale wciąż ten sam błąd ...

Czy jest ustawienie, które może sprawić, że kawałek zachowują się podobnie jak DRF 2? lub czy DRF 3 potrzebuje mnie do wyłapania znaku nieaksu w moim słowniku i ręcznego zakodowania go?

Odpowiedz

9

Znalazłem odpowiedź.

W DRF 2, rest_framework.JSONRenderer.ensure_ascii jest ustawiony na True. W DRF 3, rest_framework.JSONRenderer.ensure_ascii jest ustawiony na not api_settings.UNICODE_JSON (wcześniej opuściłem not, kiedy napisałem pytanie ...).

Tak, aby zmusić go do zachowują się jak DRF 2, musiałem ustawić „UNICODE_JSON” do False zamiast True, jakbym próbował wcześniej (Prawdą jest domyślnie):

REST_FRAMEWORK = { 
    ... 
    'UNICODE_JSON': False 
} 

Alternatywnie, Mógłbym oczywiście zakodować moje wartości słownika, które w wielu przypadkach mogłyby być lepszym rozwiązaniem.

2

Domyślnie Python 2.7 rozważa ciągi znaków binarnych. spróbuj dodać na górze plików:

from __future__ import unicode_literals 

To sprawi, że Unicode domyślnie i powinno pomóc im przeliczone prawidłowo.

+0

Dzięki. Podjąłem próbę i chociaż sprawiło to, że wszystkie odpowiednie ciągi są teraz kodowane w kodzie, kod biblioteki, który przetwarza obiekt odpowiedzi i przekształca dyktat na ciąg, nie ma tej instrukcji importowania, więc rzeczy zostaje przekonwertowany z powrotem na mieszankę unicode i zwykłych ciągów przed wykonaniem '. '.join()' ... – Troy

Powiązane problemy