Version 3.7.4 Released

391 views
Skip to first unread message

Carlton Gibson

unread,
Dec 20, 2017, 9:45:07 AM12/20/17
to Django REST framework

Escher

unread,
Dec 27, 2017, 3:51:37 PM12/27/17
to Django REST framework
3.7.4 is breaking my generics.ListAPIView views compared to 3.7.3: I'm getting the AssertionError (here) on my ListAPIView classes. They generally look like this:

class FooList(generics.ListAPIView):
    permission_classes
= (permissions.isAuthenticated,)
    model
= Foo
    serializer_class
= FooSerializer
    pagination_class
= None

   
def get_queryset(self):
       
return Foo.objects.filter(business_logic_here)

Not sure why this would happen from looking at the commits. Any ideas what's changed? Is this a bug?

Full trace just in case:

 
File "/usr/local/lib/python3.6/site-packages/django/core/handlers/exception.py", line 35, in inner
    response
= get_response(request)
 
File "/usr/local/lib/python3.6/site-packages/django/core/handlers/base.py", line 128, in _get_response
    response
= self.process_exception_by_middleware(e, request)
 
File "/usr/local/lib/python3.6/site-packages/django/core/handlers/base.py", line 126, in _get_response
    response
= wrapped_callback(request, *callback_args, **callback_kwargs)
 
File "/usr/local/lib/python3.6/site-packages/django/views/decorators/csrf.py", line 54, in wrapped_view
   
return view_func(*args, **kwargs)
 
File "/usr/local/lib/python3.6/site-packages/django/views/generic/base.py", line 69, in view
   
return self.dispatch(request, *args, **kwargs)
 
File "/usr/local/lib/python3.6/site-packages/django/utils/decorators.py", line 62, in _wrapper
   
return bound_func(*args, **kwargs)
 
File "/usr/local/lib/python3.6/site-packages/django/views/decorators/csrf.py", line 54, in wrapped_view
   
return view_func(*args, **kwargs)
 
File "/usr/local/lib/python3.6/site-packages/django/views/generic/base.py", line 69, in view
   
return self.dispatch(request, *args, **kwargs)
 
File "/usr/local/lib/python3.6/site-packages/rest_framework/views.py", line 494, in dispatch
    response
= self.handle_exception(exc)
 
File "/usr/local/lib/python3.6/site-packages/rest_framework/views.py", line 454, in handle_exception
   
self.raise_uncaught_exception(exc)
 
File "/usr/local/lib/python3.6/site-packages/rest_framework/views.py", line 491, in dispatch
    response
= handler(request, *args, **kwargs)
 
File "/usr/local/lib/python3.6/site-packages/rest_framework/decorators.py", line 53, in handler
   
return func(*args, **kwargs)
 
File "/usr/local/lib/python3.6/site-packages/django/utils/decorators.py", line 58, in bound_func
   
return func.__get__(self, type(self))(*args2, **kwargs2)
 
File "/usr/local/lib/python3.6/site-packages/rest_framework/views.py", line 477, in dispatch
    request
= self.initialize_request(request, *args, **kwargs)
 
File "/usr/local/lib/python3.6/site-packages/rest_framework/views.py", line 381, in initialize_request
    parser_context
=parser_context
 
File "/usr/local/lib/python3.6/site-packages/rest_framework/request.py", line 159, in __init__
   
.format(request.__class__.__module__, request.__class__.__name__)
AssertionError: The `request` argument must be an instance of `django.http.HttpRequest`, not `rest_framework.request.Request`.




Christian Ledermann

unread,
Jan 9, 2018, 7:54:50 AM1/9/18
to Django REST framework
I get the same error upgrading from djangorestframework==3.6.3 to djangorestframework==3.7.7


from rest_framework import viewsets
class APIBaseViewSet(viewsets.ViewSet):
       ....


test snippet:

      self.request = request_factory.get('/')
      view = APIBaseViewSet.as_view({'get': 'list'}, key='other/pattern/10/')
      response = view(self.request).render()

api_client/tests/test_views.py:53: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
venv/lib/python3.5/site-packages/django/views/decorators/csrf.py:58: in wrapped_view
    return view_func(*args, **kwargs)
venv/lib/python3.5/site-packages/rest_framework/viewsets.py:95: in view
    return self.dispatch(request, *args, **kwargs)
venv/lib/python3.5/site-packages/rest_framework/views.py:494: in dispatch
    response = self.handle_exception(exc)
venv/lib/python3.5/site-packages/rest_framework/views.py:454: in handle_exception
    self.raise_uncaught_exception(exc)
venv/lib/python3.5/site-packages/rest_framework/views.py:491: in dispatch
    response = handler(request, *args, **kwargs)
api_client/views.py:147: in retrieve
    return self.list(request, *args, **kwargs)
api_client/views.py:142: in list
    data = self._get_data()
api_client/views.py:130: in _get_data
    return self._call_proper_class(self.api_source, self._get_key())
api_client/views.py:116: in _call_proper_class
    return json.loads(api_view(self.request).render().content.decode('utf-8'))
venv/lib/python3.5/site-packages/django/views/decorators/csrf.py:58: in wrapped_view
    return view_func(*args, **kwargs)
venv/lib/python3.5/site-packages/rest_framework/viewsets.py:95: in view
    return self.dispatch(request, *args, **kwargs)
venv/lib/python3.5/site-packages/rest_framework/views.py:477: in dispatch
    request = self.initialize_request(request, *args, **kwargs)
venv/lib/python3.5/site-packages/rest_framework/viewsets.py:118: in initialize_request
    request = super(ViewSetMixin, self).initialize_request(request, *args, **kwargs)
venv/lib/python3.5/site-packages/rest_framework/views.py:381: in initialize_request
    parser_context=parser_context
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _

self = <rest_framework.request.Request object at 0x80dab0a90>, request = <rest_framework.request.Request object at 0x80da9fe48>
parsers = [<rest_framework.parsers.JSONParser object at 0x80dab0240>, <rest_framework.parsers.FormParser object at 0x80dab0320>, <rest_framework.parsers.MultiPartParser object at 0x80dab0358>]
authenticators = [<rest_framework.authentication.SessionAuthentication object at 0x80dab0278>, <rest_framework.authentication.BasicAuthentication object at 0x80dab0a20>]
negotiator = <rest_framework.negotiation.DefaultContentNegotiation object at 0x80dab09e8>
parser_context = {'args': (), 'kwargs': {}, 'view': <api_client.views.APIViewSet object at 0x80dab07b8>}

    def __init__(self, request, parsers=None, authenticators=None,
                 negotiator=None, parser_context=None):
        assert isinstance(request, HttpRequest), (
            'The `request` argument must be an instance of '
            '`django.http.HttpRequest`, not `{}.{}`.'
>           .format(request.__class__.__module__, request.__class__.__name__)
        )
E       AssertionError: The `request` argument must be an instance of `django.http.HttpRequest`, not `rest_framework.request.Request`.

venv/lib/python3.5/site-packages/rest_framework/request.py:159: AssertionError

Paul Whipp

unread,
Mar 25, 2019, 7:32:15 PM3/25/19
to Django REST framework
I am also getting this error upgrading from djangorestframework 3.7.3 to 3.9.2.

It occurs where a view function decorated with api_view invokes another view function decorated with api_view. The reason is that the drf is attempting to convert an already converted request. Here are the original functions causing the problem for me:


@api_view()
def local_site(request):
    site
= Site.objects.local
   
return untyped(request, site.pk)


# noinspection PyUnusedLocal
@api_view()
def untyped(request, pk):
   
try:
        serialized_model
= get_serialized_model(pk)
   
except ObjectDoesNotExist:
       
raise Http404('Model {} does not exist'.format(pk))
   
return Response(serialized_model)

The work around is to call the view function with the original request thus:

@api_view()
def local_site(request):
    site
= Site.objects.local
    # noinspection PyProtectedMember
   
return untyped(request._request, site.pk)


# noinspection PyUnusedLocal
@api_view()
def untyped(request, pk):
   
try:
        serialized_model
= get_serialized_model(pk)
   
except ObjectDoesNotExist:
       
raise Http404('Model {} does not exist'.format(pk))
   
return Response(serialized_model)
Reply all
Reply to author
Forward
0 new messages