django和backbone.js的问题

imn*_*mns 23 javascript python django backbone.js

我正在寻找使用我的django应用程序使backbone.js(以及jQuery)工作,但我有一些问题.我之前从未使用过一个安静的设置,所以我对使用REST的"正确"方式知之甚少.

  1. Backbone使用REST架构,但django默认不支持此功能.看起来像tastypie或活塞是实现REST api的方法.这是否意味着我必须将API用于我通过骨干进行的任何ajax调用?如果这是正确的,是否有任何性能问题或其他我需要注意的奇怪之处?

  2. 我的大多数django应用都需要身份验证.我的理解是REST api没有关于用户是否经过身份验证的任何概念,那么我该如何处理呢?我仍然可以使用登录所需的装饰与我的观点或我还做了别的吗?

  3. 那么Django的权限框架,我仍然可以设置/检查权限和组吗?

请随意单独回答每个问题,或者如果您看到我的整体混乱,请指出我正确的方向.

其中一些对你们很多人来说可能非常苛刻,但这让我很困惑,所以提前感谢你的帮助.

Sky*_*and 21

您可以将主干集合/模型指向您想要的任何URL,并在您的主干"子类"中解析您想要的响应.

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 for backbone to parse/ingest而不需要活塞或tastypie.但是,是的,这些是使用django进行全面REST的两个很好的解决方案.

这里有一些很好的提示:http://joshbohde.com/blog/backbonejs-and-django使用骨干和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()
Run Code Online (Sandbox Code Playgroud)

或者/另外,您可以通过覆盖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)
Run Code Online (Sandbox Code Playgroud)

然后,您可以从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'],
    }
Run Code Online (Sandbox Code Playgroud)

Backbone和django-tastypie很好地记录在案.花点时间构建一个简单的概念证明,并阅读几次文档.他们像豌豆和胡萝卜一样走在一起.