Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Json response list with django

I want to use typeahead.js in my forms in Django 1.7. Furthermore I want to implement that using class based views.

As far as I understand the problem, I need to create a view that generates a JSON response for the ajax request coming from typeahead.js.

Is it a good idea to use django-braces for that?

What I have so far is this:

from braces.views import JSONResponseMixin

[...]

class TagList(JSONResponseMixin, ListView):
    """
    List Tags
    """
    model = Tag
    context_object_name = 'tags'

    def get(self, request, *args, **kwargs):
        objs = self.object_list()

        context_dict = {
            "name": <do something with "obs" to get just the name fields>
            "color": <do something with "obs" to get just the color fields>
        }

        return self.render_json_response(context_dict)

That's where I'm stuck at the moment. Am I on the right path? Or would it even be possible (and easy) to go without a third party app?

like image 206
speendo Avatar asked Sep 21 '14 20:09

speendo


People also ask

How do I return JSON data in Django?

To return a queryset of python object as JSON, we first have to convert it into a Python dictionary. The process of converting one data type to another is called serialization. We import the serialize function. This function accepts the following parameters: format, queryset, and an optional fields parameter.

What is JSON response in Django?

JsonResponse is an HttpResponse subclass that helps to create a JSON-encoded response. Its default Content-Type header is set to application/json. The first parameter, data , should be a dict instance.

How do I return a JSON response?

To return JSON from the server, you must include the JSON data in the body of the HTTP response message and provide a "Content-Type: application/json" response header. The Content-Type response header allows the client to interpret the data in the response body correctly.

What is HttpResponse in Django?

HttpResponse (source code) provides an inbound HTTP request to a Django web application with a text response. This class is most frequently used as a return object from a Django view.


1 Answers

Serializing non-dictionary objects¶

In order to serialize objects other than dict you must set the safe parameter to False:

response = JsonResponse([1, 2, 3], safe=False)

https://docs.djangoproject.com/en/1.10/ref/request-response/#jsonresponse-objects

Edit:

But please be aware that this introduces a potentially serious CSRF vulnerability into your code [1] and IS NOT RECOMMENDED by the Django spec, hence it being called unsafe. If what you are returning requires authentication and you don't want a third party to be able to capture it then avoid at all costs.

In order to mitigate this vulnerability, you should wrap your list in a dictionary like so: {'context': ['some', 'list', 'elements']}

[1] https://haacked.com/archive/2008/11/20/anatomy-of-a-subtle-json-vulnerability.aspx/

like image 152
Majid Zandi Avatar answered Sep 28 '22 00:09

Majid Zandi