Стандартизированный ответ JSON от представлений - PullRequest
0 голосов
/ 07 июля 2011

Когда моя страница отправляет форму в мое представление Django, представление возвращает ответ с некоторыми данными, но вскоре я столкнулся с проблемой, что мои представления возвращали данные в разных форматах и ​​с разными наборами информации.Я думал об использовании JSON в качестве стандартного формата для возврата моих данных.

Существует два типа состояний: success и failure.Когда POST был успешным, он просто возвращает success, но когда он потерпел неудачу, он возвращает подгруппу с именем errors, которая содержит поля a и ошибку этого поля.

Вот пример ответа failure:

{"failure": {
    "errors":[
        {"fieldname": "<fieldname>", 
         "fielderror": "<fielderror>"
        },
        {"fieldname": "<fieldname>", 
         "fielderror": "<fielderror>"
        }]
}}

Вот пример ответа success:

{"success": {
    "data":[
        {"fieldname": "<fieldname>", 
         "fielddata": "<fielddata>"
        },
        {"fieldname": "<fieldname>", 
         "fielddata": "<fielddata>"
        }]
}}

(Ответ об успешном завершении имеет поля данных, потому что довольно часто вы хотите вернуть некоторые данные, т.е. ключ только что созданной записи БД.)

Это то, что я придумал, но так много людей, использующих Django, мне интересно, есть ли стандартный или более надежный способ сделать это или какой-то модуль, чтобы помочь с этим.

Спасибо.

Ответы [ 4 ]

8 голосов
/ 07 июля 2011

был там.Я написал свое решение (так как оно простое. Я не знаю, есть ли для этого модуль).Это просто оболочка ответа json

from django.utils import simplejson
from django.http import HttpResponse

class JsonResponse(HttpResponse):
    def __init__(self, data):
        content = simplejson.dumps(data)
        super(JsonResponse, self).__init__(content=content,
                                           mimetype='application/json')

class Success(JsonResponse):
    def __init__(self, something):
        x = something # set your data here
        content = {'success': {'data': x}}
        super(Success, self).__init__(content)


class Failure(JsonResponse):
    def __init__(self, something):
        x = something # set your data
        content = {'failures': {'errors': x}}
        super(Failure, self).__init__(content)

что-то в этом роде.В моем случае я заставляю Success и Failure принимать строку и словарь для аргументов (например, Success(data)), чтобы сделать его еще проще

Если ваша структура довольно сложна (или вы слишком ленивынапишите их вручную), напишите свою собственную обертку для этой сложной структуры (чтобы вы могли создать ответ с еще меньшим вводом текста) и сделайте так, чтобы Успех / Сбой принял это в качестве аргумента.

0 голосов
/ 07 июля 2011

Я думаю, что передний конец будет более убедительным аргументом в пользу того, как вы должны форматировать свои данные, а затем какие-то "стандартные", различные клиентские структуры ожидают разных вещей и адаптируются к различиям от этих ожиданий лучше или хуже.1001 *

Один из способов упростить свою жизнь состоит в том, чтобы форма ответа всегда была примерно одинаковой, например, ответ всегда будет иметь свойство status, которое всегда содержит ошибки', и если ошибок не было, то значение result.status.errors равно null.Если бы были ошибки, это был бы список строк, объясняющих, что пошло не так.даже если бы были ошибки, было бы свойство 'value', которое было бы либо нулевым, если запрос не мог быть обработан, либо запрошенным ресурсом, если бы это могло быть.

0 голосов
/ 07 июля 2011

Ну, я не знаю, насколько это вам поможет, но в Python есть модуль json.

>>> import json
>>> json.dumps({'a':'b', 'c':'d'})
'{"a": "b", "c": "d"}'
0 голосов
/ 07 июля 2011

Знаете ли вы, как использовать Python dicts? Если это так, то есть библиотеки, которые преобразуют ваш Python dict в действительный JSON. Например, встроенный в Django simplejson. Вот пример:

from django.utils import simplejson

def my_view(request):
   ....
   my_json = simplejson.dumps(my_dict) #dumps a JSON string from a dict
   my_dict_again = simplejson.loads(my_json) #loads a Python dict from a JSON string

   return HttpResponse(json, mimetype="application/json")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...