'TypeError: Object of type 'HttpResponseRedirect' is not JSON serializable

I'm trying to run a simple app which receives a payload from an external application and enters EntryLayerView. This view calls a method in utils.py which then redirects the payload to another view for processing. However, I keep seeing this not Json serializable error.

Url.py

path(
        "api/v2/myapp/assessments",
        views.EntryLayerView.as_view(),
        name="myapp-assessments",
    ),
    path(
        "api/v2/myapp/startconversation",
        views.startconversation.as_view(),
        name="myapp-start-assessment",
    ),

Views.py The entry point to the app is the EntryLayerView

class EntryLayerView(generics.GenericAPIView):
    permission_classes = (permissions.IsAuthenticated,)

    def post(self, request, *args, **kwargs):
        body = request.data
        response = get_endpoint(validated_body) #Don't worry about this line
        return Response(response, status=status.HTTP_200_OK)


class startconversation(generics.GenericAPIView):
    permission_classes = (permissions.AllowAny,)

    def post(self, request, *args, **kwargs):
        print("I'm inside the view")
        redirect = request.GET.get('all the data')
        #This is the view I'm trying to pass data to
        

utils.py

def get_endpoint(payload):
    qs = '?'+ urlencode(payload)
    reverse_url = reverse('myapp-start-assessment')
    url = reverse_url + qs
    print(url)
    return HttpResponseRedirect(url)

The output of url in utils.py is:

/api/v2/myapp/startconversation?contact_uuid=67460e74-02e3-11e8-b443-00163e990bdb&choices=None&value=&cardType=&step=None&optionId=None&path=&title=&description=&message=

Error:

    return json.dumps(*args, **kwargs)
  File "/usr/local/lib/python3.6/json/__init__.py", line 238, in dumps
    **kw).encode(obj)
  File "/usr/local/lib/python3.6/json/encoder.py", line 199, in encode
    chunks = self.iterencode(o, _one_shot=True)
  File "/usr/local/lib/python3.6/json/encoder.py", line 257, in iterencode
    return _iterencode(o, 0)
  File "/home/osboxes/ndoh-hub/venv/lib/python3.6/site-packages/rest_framework/utils/encoders.py", line 67, in default
    return super().default(obj)
  File "/usr/local/lib/python3.6/json/encoder.py", line 180, in default
    o.__class__.__name__)
TypeError: Object of type 'HttpResponseRedirect' is not JSON serializable

I'm unable to understand why I'm seeing this JSON not serializable error. It's the same issue if I use JsonResponse or redirect.



Solution 1:[1]

Try to change a little your code:

def get_endpoint(payload):
    qs = '?'+ urlencode(payload)
    reverse_url = reverse('myapp-start-assessment')
    url = reverse_url + qs
    print(url)
    return url  # return url not Response

And then in your EntryLayerView:

def post(self, request, *args, **kwargs):
    body = request.data
    url = get_endpoint(validated_body) #Don't worry about this line
    return HttpResponseRedirect(url)

Also, don't use 2.. codes for redirect, use 3.. instead.

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1 Nikita