【问题标题】:Django-RestFramework 2 and backbone.js routingDjango-Rest Framework 2 和backbone.js 路由
【发布时间】:2013-02-17 20:32:33
【问题描述】:

在使用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();
        });
    

然而这些路线从未真正进入我的视野?

【问题讨论】:

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


    【解决方案1】:

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

    没有; Django 模板适用于普通的 Django HTML 页面,而不是 REST 框架 API。 REST framework 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 将永远不会参与进来。

    简要总结一下,当您访问上述 URL 时,您的浏览器会向 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.history.start())查看URL(即window.location)并寻找URL 的锚点或“散列”部分(例如#baz)。然后,它将 URL 的该部分与其路由列表进行比较(类似于您的网络服务器如何将前面的部分与 urls.py 进行比较),如果找到匹配项,它会“将您发送到一个页面”。

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

    【讨论】:

    • +1 对路由的详细解释。关于你提到的最后一个问题。如果django负责路由到我的html页面,是否需要backbone.js路由。
    • @Warz:如果该页面有多个部分、选项卡或子页面,它们看起来应该像真正的单独页面,并且您希望它们可以从浏览器的导航栏中访问,那么可以。
    • 好的,所以如果我的页面(标签,子页面......)都有正确的 {% url %} 定义,他们不会在它们前面有井号标签“#”吗?因此主干永远不会读取路由。我真的只想能够识别 django 和骨干网中的当前 url,django 将在其中提供主模板,骨干网可以使用 ajax 进行 api 调用和更新页面的某些部分?
    • “我真的只是希望能够在 django 和骨干网中识别当前 url” - “识别”是什么意思?只有服务器可以构建到达客户端的文档,只有客户端可以通过 JS 修改该文档,所以任何一个“识别”什么都无所谓,它们都只能影响它们的领域。
    • 所以,顺序是:1)您从服务器请求 someUrl 2)服务器发回一个页面(可能是从 Django 模板构建的,3)页面加载其 Javascript,包括主干路由器,4 ) 骨干路由器检查您当前所在的 URL,然后将您“路由”到适当的视图。鉴于此,如果您希望用户转到“django view foo”和“backbone route bar”,您需要在 URL 中为他们提供包含这两个部分的链接,例如。 example.com/foo#bar。但是,假设用户访问 example.com/foo,然后您希望他们访问 Backbone 路由“bar”。你要做的是……
    猜你喜欢
    • 2015-09-26
    • 2015-03-02
    • 2012-12-04
    • 2019-02-27
    • 1970-01-01
    • 1970-01-01
    • 2015-01-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多