1

我对使用backbone.js 和django 以及Django-restframework 时设置的路由和url 感到非常困惑。

  1. 使用 REST 框架时,模板适用于何处?

例如,我为我的一个 url 定义了一个基于类的视图,我想在其中使用主干.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();
        });
    

然而这些路线从来没有真正达到我的观点?

4

1 回答 1

6

使用 REST 框架时,模板适用于何处?

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

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

它们是 100% 完全独立的。假设您有一个如下 URL:

www.example.com/foo/bar#baz

Django 将处理这么多的 URL:

www.example.com/foo/bar

而 Backbone 将处理剩余的:

#baz

当然,这假设 Django 返回一个使用 Backbone 的网页;如果没有,the#baz将永远不会进来玩。

简要总结一下,当您访问上述 URL 时,您的浏览器会要求www.example.com/输入/foo/bar. 这是你urls.py的 Django 进来的时候;它有:

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

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

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

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

于 2013-03-03T21:22:03.610 回答