5

Создание JSON-ответа с использованием Django и Python

30

Я пытаюсь преобразовать скрипт ответа Ajax на стороне сервера в Django HttpResponse, но, похоже, у меня ничего не получается.

Вот серверный скрипт:

/* ПОЛУЧЕНИЕ ЗНАЧЕНИЯ */
$validateValue=$_POST['validateValue'];
$validateId=$_POST['validateId'];
$validateError=$_POST['validateError'];

/* ВОЗВРАТ ЗНАЧЕНИЯ */
$arrayToJs = array();
$arrayToJs[0] = $validateId;
$arrayToJs[1] = $validateError;

if($validateValue =="Testuser"){  // Проверка?
    $arrayToJs[2] = "true";       // ВОЗВРАТ TRUE
    echo '{"jsonValidateReturn":'.json_encode($arrayToJs).'}';  // ВОЗВРАТ MASSIVA С УСПЕШНЫМ РЕЗУЛЬТАТОМ
}
else{
    for($x=0;$x<1000000;$x++){
        if($x == 990000){
            $arrayToJs[2] = "false";
            echo '{"jsonValidateReturn":'.json_encode($arrayToJs).'}';   // ВОЗВРАТ MASSIVA С ОШИБКОЙ.
        }
    }
}

А вот преобразованный код на Django:

def validate_user(request):
    if request.method == 'POST':
        vld_value = request.POST.get('validateValue')
        vld_id = request.POST.get('validateId')
        vld_error = request.POST.get('validateError')

        array_to_js = [vld_id, vld_error, False]

        if vld_value == "TestUser":
            array_to_js[2] = True
            x = simplejson.dumps(array_to_js)
            return HttpResponse(x)
        else:
            array_to_js[2] = False
            x = simplejson.dumps(array_to_js)
            error = 'Error'
            return render_to_response('index.html', {'error': error}, context_instance=RequestContext(request))
    return render_to_response('index.html', context_instance=RequestContext(request))

Я использую simplejson для кодирования списка Python (чтобы он возвращал JSON-массив). Не могу понять, в чем проблема. Но я думаю, что что-то не так с 'echo'.

5 ответ(ов)

0

Вопрос: Как создать представление в Django и Django REST Framework, чтобы вернуть JSON-ответ?

Ответ: Вы можете использовать классовые представления (Class-Based Views) в Django и Django REST Framework для возврата JSON-ответов. Вот пример, как это сделать.

С использованием Django:

from django.views import View
from django.http import JsonResponse

class JsonView(View):
    def get(self, request):
        return JsonResponse({'some': 'data'})

В этом примере мы создаем класс JsonView, который наследует от View. Метод get обрабатывает GET-запрос и возвращает JSON-ответ с помощью JsonResponse.

А теперь с использованием Django REST Framework:

from rest_framework.views import APIView
from rest_framework.response import Response

class JsonView(APIView):
    def get(self, request):
        return Response({'some': 'data'})

Здесь мы используем APIView от Django REST Framework, а метод get возвращает ответ в формате JSON с помощью Response.

Оба примера выполняют одну и ту же задачу, но представление с использованием Django REST Framework имеет дополнительные возможности и гибкость для работы с API.

0

Вы можете создать свой собственный класс JsonResponse, наследующий от HttpResponse в Django, для удобной работы с JSON-ответами. Вот пример реализации этого класса:

from django.http import HttpResponse
import json

class JsonResponse(HttpResponse):
    def __init__(self, content={}, mimetype=None, status=None,
                 content_type='application/json'):
        super(JsonResponse, self).__init__(json.dumps(content), mimetype=mimetype,
                                           status=status, content_type=content_type)

В вашем представлении вы можете использовать JsonResponse следующим образом:

resp_data = {'my_key': 'my value',}
return JsonResponse(resp_data)

В этом примере вы создаете словарь resp_data и передаете его в ваш кастомный JsonResponse. Класс автоматически сериализует ваш словарь в JSON и устанавливает заголовок контента в application/json.

0

Вы можете использовать сериализаторы Django для работы с юникодом. Вот пример кода:

from django.core import serializers
from django.http import HttpResponse

json_serializer = serializers.get_serializer("json")()
response = json_serializer.serialize(list, ensure_ascii=False, indent=2, use_natural_keys=True)
return HttpResponse(response, content_type="application/json")

В этом коде мы получаем сериализатор JSON, сериализуем данные с выключенной экранированием юникода (при этом строки в ответе будут в их оригинальном виде) и возвращаем ответ с правильным MIME-типом для JSON. Не забудьте заменить list на ваш конкретный набор данных, который вы хотите сериализовать.

0

В Django версии 1.7 и выше очень удобно использовать класс JsonResponse, который является подклассом HttpResponse. Пример использования:

from django.http import JsonResponse

def profile(request):
    data = {
        'name': 'Raghav',
        'location': 'India',
        'is_active': False,
        'count': 28
    }
    return JsonResponse(data)

Для более старых версий Django вам нужно использовать объект HttpResponse. Вот как это можно сделать:

import json
from django.http import HttpResponse

def profile(request):
    data = {
        'name': 'Raghav',
        'location': 'India',
        'is_active': False,
        'count': 28
    }
    dump = json.dumps(data)
    return HttpResponse(dump, content_type='application/json')

Таким образом, если у вас версия Django 1.7 или выше, рекомендуется использовать JsonResponse для более удобной работы с JSON-данными.

0

Чтобы вернуть JSON в Django, сначала импортируйте необходимый модуль:

from django.http import HttpResponse

Если у вас уже есть JSON-данные, можно сделать так:

def your_method(request):
    your_json = [{'key1': 'value', 'key2': 'value'}]  # Замените 'value' на реальные значения
    return HttpResponse(json.dumps(your_json), content_type='application/json')

Обратите внимание, что нужно использовать json.dumps для преобразования ваших данных в строку JSON. Не забудьте импортировать модуль json, добавив:

import json

Если же вам требуется получить JSON из другого HTTP-запроса, используйте следующий код:

import requests  # Не забудьте установить библиотеку requests

def your_method(request):
    response = requests.get('https://www.example.com/get/json')
    return HttpResponse(response.content, content_type='application/json')

Здесь мы используем библиотеку requests для выполнения GET-запроса. Убедитесь, что она установлена в вашем проекте. В обоих случаях важно правильно установить заголовок контента как application/json, чтобы клиент правильно обрабатывал ответ.

Чтобы ответить на вопрос, пожалуйста, войдите или зарегистрируйтесь