Как я могу передать объект детали для пользовательской авторизации в deliciouspie?

Как я могу получить доступ к подробному объекту конечной точки, доступ к которому осуществляется в запросе во время авторизации вкусного пирога?

Я заметил, что один из переопределенных методов в docs имеет объектный параметр - как его установить?


person Erik    schedule 10.07.2012    source источник
comment
На данный момент моим лучшим решением является использование атрибута пути объекта запроса. Это кажется хакерским...   -  person Erik    schedule 11.07.2012


Ответы (2)


В филиале Пермь,

https://github.com/toastdriven/django-tastypie/blob/perms/tastypie/authorization.py

Класс Authorization имеет набор методов, например:

def read_detail(self, object_list, bundle):
    """
    Returns either ``True`` if the user is allowed to read the object in
    question or throw ``Unauthorized`` if they are not.
    Returns ``True`` by default.
    """
    return True

Здесь вы можете попробовать получить доступ к obj через bundle.obj

Если вы не можете использовать ветку perms, я предлагаю вам следующий способ:

class MyBaseAuth(Authorization):
    def get_object(self, request):
        try:
            pk = resolve(request.path)[2]['pk']
        except IndexError, KeyError:
            object = None # or raise Exception('Wrong URI')
        else:
            try:
                object = self.resource_meta.object_class.objects.get(pk=pk)
            except self.resource_meta.DoesNotExist:
                object = None
        return object


class FooResourceAuthorization(MyBaseAuth):
    def is_authorized(self, request, object=None):
        if request.method in ('GET', 'POST'):
            return True
        elif request.method == 'DELETE':
            object = self.get_object(request)
            if object.profile = request.user.profile:
                return True
        return False
person Andrei Kaigorodov    schedule 11.07.2012
comment
Я не уверен, что смогу перейти в эту ветку - есть много других изменений, которые мне нужно будет просмотреть. - person Erik; 11.07.2012

Хакерский, но с простым способом доступа к объекту из URL-адреса запроса (вдохновленный кодом внутри DjangoAuthorization).

def is_authorized(self, request, object=None):

    meta = self.resource_meta
    re_id = re.compile(meta.api_name + "/" + meta.resource_name + "/(\d+)/")
    id = re_id.findall(request.path)

    if id:
        object = meta.object_class.objects.get(id=id[0])

        # do whatever you want with the object
    else:
        # It's not an "object call"
person Raz    schedule 09.01.2013