Подтвердить что ты не робот

Вопросы django и backbone.js

Я ищу сделать backbone.js(плюс jQuery) работу с моим приложением django, но у меня есть некоторые вопросы. Раньше я никогда не пользовался успокаивающей настройкой, поэтому я очень мало знаю о "правильном" способе использования REST.

  • Backbone использует архитектуру REST, но django по умолчанию не поддерживает это. Похоже, что tastypie или поршень - это путь для реализации REST api. Означает ли это, что я должен использовать API для любых вызовов ajax, которые я делаю через магистраль? Если это правильно, есть ли какие-либо проблемы с производительностью или другие странности, о которых я должен знать?

  • Для большинства приложений django требуется аутентификация. Я понимаю, что у REST api нет понятия о том, аутентифицирован ли пользователь или нет, так как я могу это обработать? Смогу ли я по-прежнему использовать декор, необходимый для входа, с моими представлениями или сделать что-то еще?

  • Как насчет рамки разрешения Django, я все еще смогу установить/проверить разрешения и группы?

Пожалуйста, не стесняйтесь отвечать на каждый вопрос индивидуально, или если вы видите мою общую путаницу, пожалуйста, укажите мне в правильном направлении.

Некоторые из них, вероятно, очень многообразны для многих из вас, но меня это смутило, поэтому заранее заблаговременно за вашу помощь.

4b9b3361

Ответ 1

вы можете указать коллекции/модели опорных костей на любые требуемые 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 для магистрали для синтаксического анализа/глотания без поршня или tastypie. Но, да, это два хороших решения для всеобъемлющего REST с django.

Здесь есть несколько полезных советов: 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()

Альтернативно/дополнительно вы можете создавать ресурсы, которые возвращают только пользовательские объекты, переопределяя метод 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'],
    }

Магистраль и django-tastypie хорошо документированы. Потратьте время, чтобы построить простое доказательство концепции и несколько раз прочитать документы. Они идут вместе, как горох и морковь.