Django和Backbone.js相关问题

23 投票
1 回答
5033 浏览
提问于 2025-04-16 23:18

我正在尝试让 backbone.js(加上 jQuery)与我的 django 应用一起工作,但我有一些问题。我之前从未使用过 RESTful 结构,所以对“正确”的使用 REST 的方式了解得很少。

  1. Backbone 使用 REST 架构,但 django 默认不支持这个。看起来 tastypie 或 piston 是实现 REST API 的好选择。这是否意味着我在通过 backbone 进行的任何 ajax 调用都必须使用这个 API?如果是这样的话,有没有性能问题或者其他需要注意的地方?

  2. 我的大部分 django 应用都需要用户认证。我理解 REST API 并没有用户是否认证的概念,那我该怎么处理这个问题?我还能在我的视图中使用登录要求的装饰器,还是需要做其他的事情?

  3. 关于 Django 的权限框架,我还能设置/检查权限和用户组吗?

请随意单独回答每个问题,或者如果你能看出我整体的困惑,请指引我正确的方向。

这些问题可能对你们中的很多人来说很基础,但我确实感到困惑,所以提前感谢你们的帮助。

1 个回答

21

你可以把 Backbone 的集合和模型指向你想要的任何网址,并且可以在你的 Backbone “子类”中以你想要的方式解析响应。

Model.url:

http://documentcloud.github.com/backbone/docs/backbone.html#section-43

Collection.parse:

http://documentcloud.github.com/backbone/docs/backbone.html#section-69

你可以设置一次性的请求处理程序,让它返回一些 JSON 数据,供 Backbone 解析和使用,而不需要用到 piston 或 tastypie。不过,确实,这两者都是与 Django 搭配使用 REST 的不错解决方案。

这里有一些不错的建议:http://joshbohde.com/blog/backbonejs-and-django,可以帮助你了解如何将 Backbone 与 tastypie 一起使用。

使用 tastypie,你可以通过自定义的授权和认证来限制对 API 的访问。

http://django-tastypie.readthedocs.org/en/latest/authentication_authorization.html

你可以创建一个授权方案,确保对象列表只显示用户“拥有”的对象,像这样:

class PerUserAuthorization(Authorization):
  def apply_limits(self, request, object_list):
    if request and hasattr(request, 'user'):
        if request.user.is_authenticated():
            object_list = object_list.filter(user=request.user)
            return object_list

    return object_list.none()

另外,你还可以通过重写 ModelResource.apply_authorization_limits 方法,创建只返回用户对象的资源,并通过重写 obj_create 方法,自动将用户与创建的对象关联,像这样:

class PerUserModelResource(ModelResource):

  def obj_create(self, bundle, request=None, **kwargs):
    return ModelResource.obj_create(self, bundle, request, user=request.user)

  def apply_authorization_limits(self, request, object_list):
    return object_list.filter(user=request.user)

然后,你可以从 PerUserModelResource 继承,或者将 PerUserAuthorization 作为资源的授权方式。

class ImageGroupResource(PerUserModelResource):
  study = fields.ForeignKey(StudyResource, "study")
  uploads = fields.ToManyField('cm.api.UploadResource', 'uploads', null=True)

  class Meta:
    queryset = ImageGroup.objects.all()
    list_allowed_methods = ['get', 'post']
    detail_allowed_methods = ['get', 'post', 'put', 'delete']
    resource_name = 'cm/imagegroup'
    authorization = PerUserAuthorization()
    filtering = {
        'name': ALL,
        'created_dt': ['exact', 'range', 'gt', 'gte', 'lt', 'lte'],
    }

Backbone 和 django-tastypie 的文档都写得很好。花点时间建立一个简单的概念验证,并多读几遍文档。它们就像豌豆和胡萝卜一样搭配得很好。

撰写回答