Django-RestFramework 2和backbone.js路由

时间:2013-03-03 19:38:25

标签: django backbone.js django-rest-framework

在将backbone.js和django与Django-restframework一起使用时,我对路由和url设置非常困惑。

  1. 使用REST框架时模板适合哪里?
  2. 例如,我为我的一个网址定义了一个基于类的视图,我想使用backbone.js来更新显示学生的div

    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
    
    • Backbone路由如何适应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();
          });
      

    然而这些路线从未真正得到我的观点?

1 个答案:

答案 0 :(得分:6)

  
    

使用REST框架时模板适合哪些?

  

没有; Django模板适用于普通的Django HTML页面,而不适用于REST框架API。 REST框架API响应是以编程方式生成的文档(通常是JSON或XML),因此它们不需要模板。

  
    

Backbone路由如何适应django的URL路由

  

它们100%完全分开。假设你有一个像:

这样的网址
www.example.com/foo/bar#baz

Django会处理这个URL:

www.example.com/foo/bar

而Backbone将处理其余的:

#baz

当然,这假设Django返回一个使用Backbone的网页;如果没有,#baz将永远不会参与其中。

作为简要摘要,当您访问上述网址时,您的浏览器会向www.example.com/询问/foo/bar。这是你在Django的urls.py进来的时候;它有:

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

所以你的网络服务器知道发送回views.FooBar.as_view()给它的任何内容(无论是REST框架生成的JSON文档还是旧式的Django HTML文档)。

一旦该文档返回到服务器,它就会呈现它,这就是Backbone及其路由器等客户端代码轮流使用的地方。 Backbone Router(无论何时调用Backbone.history.start())查看URL(即window.location)并查找URL的锚点或“哈希”部分(例如#baz)。然后,它会将URL的这一部分与其路由列表进行比较(类似于您的网络服务器将早期部分与urls.py进行比较),如果找到匹配,则会“将您发送到页面”。

这是理解的关键,它根本不会送你到任何地方;所有它真正做的是改变URL的哈希部分,然后运行一些操纵DOM的Javascript。因此,Backbone路由器不可能将您发送到Django URL;如果要访问服务器路由,则需要使用AJAX或window.location =