Django-RestFramework 2和backbone.js路由

War*_*arz 1 django backbone.js django-rest-framework

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

  1. 使用REST框架时模板适合哪里?

例如,我有一个基于类的视图为我的一个url定义,我想使用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
Run Code Online (Sandbox Code Playgroud)
  • 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();
        });
    
    Run Code Online (Sandbox Code Playgroud)

但这些路线从未实际发表过我的看法?

mac*_*ost 6

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

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

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

它们100%完全分开.假设你有一个像这样的网址:

www.example.com/foo/bar#baz
Run Code Online (Sandbox Code Playgroud)

Django将处理这个URL:

www.example.com/foo/bar
Run Code Online (Sandbox Code Playgroud)

而Backbone将处理剩余的:

#baz
Run Code Online (Sandbox Code Playgroud)

当然,这假设Django返回一个使用Backbone的网页; 如果没有,那么它#baz甚至都不会发挥作用.

作为一个快速摘要,当你访问一个网址像上面,浏览器会询问www.example.com//foo/bar.这是你urls.py在Django进来的时候; 它有:

url(r'^foo/bar/?$', views.FooBar.as_view()),
Run Code Online (Sandbox Code Playgroud)

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

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

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