如何在django-tastypie中获取授权用户对象

时间:2012-03-20 10:59:21

标签: django tastypie

我需要在hydrate方法中获得授权的用户对象,类似的东西:

class SalepointResource(ModelResource):
  def hydrate(self, bundle):
    user = bundle.request.user

但是请求这里是空的 HttpRequest 对象,并且没有用户方法,尽管用户已获得授权。有没有办法获取用户对象?

3 个答案:

答案 0 :(得分:0)

您是否在tastypie中正确设置了身份验证/授权?

答案 1 :(得分:0)

不确定这是否是最佳方法,但我通过继承ModelResource类并重写其某些方法来解决这个问题。在ModelResource中,request对象(包含user)是obj_update方法的参数,但不会传递给full_hydrate方法,转过来hydrate。您必须对每个方法进行一些小的更改,以便将request对象一直传递到链中。

方法修改是微不足道的。详细说明:

from django.core.exceptions import ObjectDoesNotExist, MultipleObjectsReturned, ValidationError
from tastypie.resources import ModelResource
from tastypie.exceptions import NotFound, BadRequest, InvalidFilterError, HydrationError, InvalidSortError, ImmediateHttpResponse

class MyModelResource(ModelResource):
    def obj_create(self, bundle, request=None, **kwargs):
        ...
        bundle = self.full_hydrate(bundle, request)
        ...

    def obj_update(self, bundle, request=None, **kwargs):
        ...
        bundle = self.full_hydrate(bundle, request)
        ...

    def full_hydrate(self, bundle, request=None):
        ...
        bundle = self.hydrate(bundle, request)
        ...

    def hydrate(self, bundle, request=None):
        ...
        return bundle

然后将您的资源设为此新类的子类并覆盖新版hydrate

class MyModelResource(MyModelResource):
    class Meta:
        queryset = MyModel.objects.all()

    def hydrate(self, bundle, request):
        bundle.obj.updated_by_id = request.user.id
        return bundle

我没有彻底测试过,但到目前为止似乎有效。希望它有所帮助。

答案 2 :(得分:0)

使用TastyPie 0.9.15,我发现这有效:

def hydrate_user(self, bundle):
    bundle.obj.user = bundle.request.user
    return bundle

不需要子类ModelResource。此处user是模型和资源的ForeignKey。 我发布这个作为答案,因为虽然看起来很简单,但我花了很长时间才弄明白。