[python] Django에서 템플릿을 사용하지 않고 JSON을 반환하려면 어떻게해야합니까?

이것은이 질문과 관련이 있습니다 : Django는 클라이언트 파이썬에 따라 json과 html을 반환합니다 .


Django 앱용 명령 줄 Python API가 있습니다. API를 통해 앱에 액세스하면 JSON을 반환해야하고 브라우저에서는 HTML을 반환해야합니다. 다른 URL을 사용하여 다른 버전에 액세스 할 수 있지만 하나의 템플릿으로 views.py 에서 HTML 템플릿과 JSON을 어떻게 렌더링 합니까?

HTML을 렌더링하려면 다음을 사용합니다.

return render_to_response('sample/sample.html....')

하지만 JSON 템플릿을 넣지 않고 어떻게 JSON에 대해 똑같이 할 수 있습니까? ( 대신 content-type이어야 함 )application/jsontext/html

JSON 및 HTML 출력을 결정하는 것은 무엇입니까?

그래서 내 views.py에서 :

if something:
    return render_to_response('html_template',.....)
else:
    return HttpReponse(jsondata,mimetype='application/json')



답변

나는 당신이 원하는 것에 대해 문제가 혼란스러워했다고 생각합니다. 실제로 JSON 응답에 HTML을 넣으려는 것이 아니라 대신 HTML 또는 JSON을 반환하고 싶다고 생각합니다.

첫째, 둘의 핵심적인 차이점을 이해해야합니다. HTML은 프리젠 테이션 형식입니다. 데이터 자체보다 데이터를 표시하는 방법을 더 많이 다룹니다. JSON은 그 반대입니다. 순수한 데이터입니다. 기본적으로 여러분이 가지고있는 일부 Python (이 경우) 데이터 셋의 JavaScript 표현입니다. 이는 단순히 상호 교환 레이어 역할을하므로 앱의 한 영역 (보기)에서 일반적으로 서로 액세스 할 수없는 앱의 다른 영역 (자바 스크립트)으로 데이터를 이동할 수 있습니다.

이를 염두에두고 JSON을 “렌더링”하지 않으며 관련된 템플릿도 없습니다. 단순히 플레이중인 데이터 (템플릿에 컨텍스트로 전달하는 데이터)를 JSON으로 변환하기 만하면됩니다. 이는 Django의 JSON 라이브러리 (simplejson) (자유 형식 데이터 인 경우) 또는 직렬화 프레임 워크 (쿼리 세트 인 경우)를 통해 수행 할 수 있습니다.

Simplejson

from django.utils import simplejson

some_data_to_dump = {
   'some_var_1': 'foo',
   'some_var_2': 'bar',
}

data = simplejson.dumps(some_data_to_dump)

직렬화

from django.core import serializers

foos = Foo.objects.all()

data = serializers.serialize('json', foos)

어느 쪽이든 그런 다음 해당 데이터를 응답에 전달합니다.

return HttpResponse(data, content_type='application/json')

[편집] Django 1.6 및 이전 버전에서 응답을 반환하는 코드는 다음과 같습니다.

return HttpResponse(data, mimetype='application/json')

[편집] : simplejson이 django 에서 제거되었습니다 . 다음을 사용할 수 있습니다.

import json

json.dumps({"foo": "bar"})

또는 django.core.serializers위에서 설명한대로 사용할 수 있습니다 .


답변

Django 1.7에서는 내장 된 JsonResponse를 사용하면 훨씬 더 쉽습니다.

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

# import it
from django.http import JsonResponse

def my_view(request):

    # do something with the your data
    data = {}

    # just return a JsonResponse
    return JsonResponse(data)


답변

JSON 응답의 경우 렌더링 할 템플릿이 없습니다. 템플릿은 HTML 응답을 생성하기위한 것입니다. JSON은 HTTP 응답입니다.

그러나 JSON 응답과 함께 템플릿에서 렌더링 된 HTML을 가질 수 있습니다.

html = render_to_string("some.html", some_dictionary)
serialized_data = simplejson.dumps({"html": html})
return HttpResponse(serialized_data, mimetype="application/json")


답변

Django REST 프레임 워크는 사용할 렌더러를 자동으로 결정하기 위해 요청에서 HTTP 수락 헤더를 사용하는 것처럼 보입니다.

http://www.django-rest-framework.org/api-guide/renderers/

HTTP accept 헤더를 사용하면 “if something”에 대한 대체 소스를 제공 할 수 있습니다.


답변

django 1.9에서 JSON으로 모델을 렌더링하려면 내 views.py에서 다음을 수행해야했습니다.

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

def index(request):
    objs = Mymodel.objects.all()
    jsondata = serializers.serialize('json', objs)
    return HttpResponse(jsondata, content_type='application/json')


답변

rfc에 지정된대로 요청 수락 콘텐츠 유형을 확인할 수도 있습니다. 이렇게하면 기본 HTML로 렌더링 할 수 있으며 클라이언트가 애플리케이션 / 제이슨을 수락하는 경우 템플릿 없이도 응답에 json을 반환 할 수 있습니다.


답변

from django.utils import simplejson
from django.core import serializers

def pagina_json(request):
   misdatos = misdatos.objects.all()
   data = serializers.serialize('json', misdatos)
   return HttpResponse(data, mimetype='application/json')