2011-01-19 1 views
3

나는 지금 막 꽤 큰 프로젝트에서 모든 URL을 통해 일반 요청과 ajax 요청을 통해 액세스 할 수 있어야합니다. 나는 이것을 매우 일반적인 방법으로 처리하기위한 작은 프레임 워크를 만드는 방법에 대한 아이디어를 찾고있다. 뷰가 아약스를 통해 호출되는지 여부에 따라 다른 템플릿을 렌더링하고 HttpResponse 오브젝트 대신 json을 리턴해야합니다. 이 주제에 대한 아이디어를 수집하고 싶습니다. 주요 목표는 건식 원칙을 피하고 코드를 최대한 재사용 할 수 있어야합니다. 나는 일반적인 뷰, 뷰어의 데코레이터 등과 같은 다른 옵션을 이미 고려하고 있었지만, 나는 무엇이든 열려있다. 제 제안을 듣거나 내가 아는 레디 메이드 스 니펫을 향해 나를 가르쳐주세요!장고와 함께 Ajax 뷰

답변

6

This article 아약스와 일반 요청을 함께 사용하는 방법에 대한 훌륭한 자습서 인 것 같습니다. request 개체의 메서드는 is_ajax()이며 HTTP_X_REQUESTED_WITH: XMLHttpRequest을 찾습니다. 이것은 물론 요청을 보내는 자바 스크립트가 올바르게 설정 한 값에 따라 달라집니다.

문서에서

:

from django.http import HttpResponse 
from django.core import serializers 
from django.shortcuts import render_to_response 
from your_app.models import ExampleModel 

def xhr_test(request, format): 
    obj = ExampleModel.objects.all() 
    if request.is_ajax(): 
     data = serializers.serialize('json', obj) 
     return HttpResponse(data,'json') 
    else: 
     return render_to_response('template.html', {'obj':obj}, context=...) 

를 또는, 장고를위한 편안하고 프레임 워크입니다 django-piston를 사용할 수 있습니다. 내 프로젝트에서이 모듈을 사용합니다. 당신은 리소스 (뷰와 같은 종류)를 정의 할 수 있으며, URL에 전달 된 MIME 형식 또는 형식에 따라 html, xml 또는 json을 내 보냅니다. 모든 단일보기 (또는 대다수)를 다른 형식으로 반환해야하는 경우이 방법이 가장 좋습니다.

+0

글쎄,이 작업을 수행하는 일반적인 방법입니다.보기에서 아약스/비 아약스 요청을 항상 반복하지 않아도되는 좋은 방법을 찾고 있습니다 ... –

+0

@lazer는 내 끝을 봅니다. 장고 피스톤에 대해 이야기하는 답변. 이를 통해 mime-type 또는 url 매개 변수를 기반으로 다른 응답을 반환 할 수 있습니다. –

+0

프로젝트의 일부인 피스톤에 대한 +1이지만 "정상적인"사용을위한 나머지 API로만 사용됩니다 .. –

0

저는 이것을 위해 데코레이터를 사용했습니다. 뷰에서 컨텍스트, 템플리트 및 대체 템플리트를 리턴하도록하십시오.

Ajax 버전에서 데이터를 반환하려는 경우 세 번째 반환 값은 JSON으로 변환 할 데이터 객체가 될 수 있습니다.