Django RestFramework 2和backbone.js路由
在使用backbone.js和django以及django restframework时,我对路由和url设置感到非常困惑Django RestFramework 2和backbone.js路由,django,backbone.js,django-rest-framework,Django,Backbone.js,Django Rest Framework,在使用backbone.js和django以及django restframework时,我对路由和url设置感到非常困惑 当使用REST框架时,模板的位置在哪里 例如,我为我的一个URL定义了一个基于类的视图,我想在其中使用backbone.js更新div显示学生: url(r'^home/students/$', views.StudentList.as_view()), class StudentList(APIView): """ List all students
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
- 主干路由如何与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(); });
www.example.com/foo/bar#baz
Django将处理该URL的大部分内容:
www.example.com/foo/bar
而主干网将处理剩余的:
#baz
当然,这假设Django返回一个使用主干的网页;如果不这样做,#baz
将永远无法播放
作为一个简短的总结,当您访问上述URL时,您的浏览器将询问www.example.com/
以获取/foo/bar
。这就是Django中的url.py
出现的时候;它有:
url(r'^foo/bar/?$', views.FooBar.as_view()),
因此,您的Web服务器知道如何发回views.FooBar.as_view()
提供的任何内容(无论是REST框架生成的JSON文档还是老式的Django HTML文档)
一旦该文档返回到服务器,它就会呈现它,这就是客户端代码(如主干网及其路由器)的位置。主干路由器(无论何时调用主干.history.start()
)都会查看URL(即窗口.location
)并查找URL的锚或“散列”部分(例如#baz
)。然后,它将URL的该部分与其路由列表进行比较(类似于您的Web服务器将前面的部分与URL.py进行比较的方式),如果找到匹配项,它将“将您发送到页面”
这是理解的关键,它根本不会把你送到任何地方;它真正做的就是更改URL的哈希部分,然后运行一些Javascript来操纵DOM。因此,主干路由器不可能将您发送到Django URL;如果您想点击服务器路径,则需要使用AJAX或window.location=
当使用REST框架时,模板的位置在哪里
事实并非如此;Django模板用于普通的Django HTML页面,而不是REST框架API。REST框架API响应是通过编程生成的文档(通常是JSON或XML),因此它们不需要模板
主干路由如何适应django的url路由
它们是100%完全分开的。假设您有一个URL,如:
www.example.com/foo/bar#baz
Django将处理该URL的大部分内容:
www.example.com/foo/bar
而主干网将处理剩余的:
#baz
当然,这假设Django返回一个使用主干的网页;如果不这样做,#baz
将永远无法播放
作为一个简短的总结,当您访问上述URL时,您的浏览器将询问www.example.com/
以获取/foo/bar
。这就是Django中的url.py
出现的时候;它有:
url(r'^foo/bar/?$', views.FooBar.as_view()),
因此,您的Web服务器知道如何发回views.FooBar.as_view()
提供的任何内容(无论是REST框架生成的JSON文档还是老式的Django HTML文档)
一旦该文档返回到服务器,它就会呈现它,这就是客户端代码(如主干网及其路由器)的位置。主干路由器(无论何时调用主干.history.start()
)都会查看URL(即窗口.location
)并查找URL的锚或“散列”部分(例如#baz
)。然后,它将URL的该部分与其路由列表进行比较(类似于您的Web服务器将前面的部分与URL.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)您从服务器请求某个URL 2)服务器发回一个页面(可能是从Django模板构建的,3)页面加载Javascript,包括主干路由器,主干路由器检查您当前所在的URL