2013-03-03 2 views
1

backbone.js와 django를 Django-restframework와 함께 사용할 때 라우팅과 URL에 대해 혼란스러워합니다.Django-RestFramework 2와 backbone.js routing

  1. 템플릿은 REST 프레임 워크를 사용할 때 어디에 적합합니까?

    url(r'^home/students/$', views.StudentList.as_view()), 
    
    class StudentList(APIView): 
        """ 
        List all students 
        """ 
        def get(self, request, format=None): 
         students = Person.objects.filter(person_type = Person.STUDENT) 
         serializer = PersonSerializer(students) 
         return Response(serializer.data, "core/teachers/teacher_teaching.html") 
    
        def pre_save(self, obj): 
         obj.owner = self.request.user 
    
    • 방법 백본을 수행

예를 들어, 나는 그냥 div 표시 학생들을 업데이트 backbone.js를 사용하려면 내 URL 중 하나에 대해 정의 된 클래스를 기반으로보기를 경로는 django의 URL 라우팅에 적합합니다. 나는, 파일 router.js에서 이런 일이 :

function($,jqueryui, _, Backbone, HomeView, StudentsView) { 

var AppRouter = Backbone.Router.extend({ 
    routes: { 
     // Define some URL routes 
     ':home': 'showStudents', 
     'users': 'showContributors', 

     // Default 
     '*actions': 'defaultAction' 
    } 
}); 

var initialize = function(){ 

    var app_router = new AppRouter; 

    app_router.on('route:showStudents', function(){ 

     // Call render on the module we loaded in via the dependency array 
     var studentsView = new StudentsView(); 
     studentsView.render(); 
    }); 

그러나 경로가 실제로 내 의견에 도착하지?

답변

6

여기서 템플릿은 REST 프레임 워크를 사용할 때 적합합니까?

그렇지 않습니다. 장고 템플릿은 일반 Django HTML 페이지 용이며 REST 프레임 워크 API 용 템플릿은 아닙니다. REST 프레임 워크 API 응답은 프로그래밍 방식으로 생성 된 문서 (일반적으로 JSON 또는 XML)이므로 템플릿이 필요하지 않습니다.

어떻게 백본 노선들은 그들은 100 % 완전히 분리되어 장고

의 URL 라우팅에 맞지 않습니다. 물론

#baz 

, 즉 가정

www.example.com/foo/bar 

는 백본이 남아 처리 할 때 :

www.example.com/foo/bar#baz 
이 가

장고 해당 URL이 많이 처리됩니다의 당신이 같은 URL 있다고 가정 해 봅시다 장고는 백본을 사용하는 웹 페이지를 반환합니다. 그렇지 않은 경우 #baz이 재생되지 않습니다.

위와 같은 URL을 방문하면 빠른 요약으로 www.example.com//foo/bar이 표시됩니다. Django에 urls.py이 들어있을 때입니다. 그것은이 있습니다

url(r'^foo/bar/?$', views.FooBar.as_view()), 

때문에 웹 서버는 views.FooBar.as_view() (즉 REST 프레임 워크 생산 JSON 문서 또는 오래된 학교 장고 HTML 문서인지 여부)를 제공합니다 어떤 다시 보낼 알고있다.

일단 문서가 서버로 돌아 오면 렌더링하고 백본과 라우터와 같은 클라이언트 쪽 코드가 돌아갑니다. 백본 라우터 (Backbone.history.start()에 전화 할 때마다)는 URL을 봅니다 (즉,window.location) URL의 앵커 또는 "해시"부분을 찾습니다 (예 : #baz). 그런 다음 URL의 해당 부분을 경로 목록과 비교하여 (웹 서버가 이전 부분을 urls.py와 비교 한 것과 비슷 함) 일치하는 항목을 찾으면 페이지를 보냅니다.

이해하는 것이 중요하지만, 실제로 아무데도 보내지 않습니다. 모든 작업은 URL의 해시 부분을 변경 한 다음 DOM을 조작하는 일부 자바 스크립트를 실행하는 것입니다. 따라서 백본 라우터가 Django URL로 사용자를 보내는 것은 불가능합니다. 서버 경로를 선택하려면 AJAX 또는 window.location =을 사용해야합니다.

+0

라우팅에 대한 훌륭한 설명은 +1입니다. 당신이 언급 한 것에 대한 마지막 질문 하나만 남았습니다. django가 내 html 페이지에 대한 라우팅을 담당한다면 backbone.js 라우팅이 필요합니다. – Warz

+0

@Warz : 페이지에 여러 개의 섹션, 탭 또는 서브 페이지가있는 경우 실제 별도의 페이지처럼 보이게하고 브라우저의 탐색 바에서 액세스 할 수 있도록하려면 예. –

+0

좋아, 내 페이지 (탭, 서브 페이지 ...)가 모두 적절한 {% url %} 정의를 가지고 있다면, 그 앞에 해시 태그 '#'이 없으므로 백본이 결코 경로를 읽지 않을 것입니다. 나는 장고와 백본의 현재 URL을 인식 할 수 있기를 원한다. 장고는 기본 템플릿을 제공하고 백본은 API 호출을하고 페이지의 특정 부분을 아약스로 업데이트 할 수있다. – Warz