2

私が持っているとします:

models.py

class Books(models.Model):
    owner = models.ForeignKey(User)
    title = models.CharField(max_length = 100)

api.py

class UserResource(ModelResource):
    #blhblahblah as usual

class BooksResource(ModelResource):

    owner= fields.ToOneField(UserResource, 'owner')

    class Meta:
        queryset = Books.objects.all()
        authorizarion = Authorization()

それから私は発行します:

curl --dump-header - -H "Content-Type: application/json" -X POST --data "{\"owner\" : \"/api/v1/user/1/\", \"title\" : \"foo\"}" http://localhost:8000/api/data/album/

そしてそれは働いています、私は私の新しいものを手に入れましたBooks

\"owner\" : \"/api/v1/user/1/\" 次に、これをに追加してを取り除こうとしますBooksResource

def hydrate_owner(self, bundle):
    bundle.obj.owner = User.objects.get(pk = bundle.request.user.id)
    return bundle

curlなしでもう一度行う\"owner\" : \"/api/v1/user/1/\"と、応答は404 not found

次に、別の方法を試します:

def obj_create(self, bundle, request = None, **kwargs):
    return super(BooksResource, self).obj_create(bundle, request, owner = User.objects.get(pk = request.user.id))

また

def obj_create(self, bundle, request = None, **kwargs):
    return super(BooksResource, self).obj_create(bundle, request, owner = User.objects.get(pk = bundle.request.user.id))

私はまだ得る404 not found

みんな私を助けることができますか?

4

2 に答える 2

1

新しいオブジェクトの所有者を設定するためのパスとして、このパスをたどり始めましたが、更新リクエストで承認チェックを行うときに問題が発生しました (単体テストを行ってください!)。

セットアップ: オブジェクト A - ユーザー X が所有し、オブジェクト A を変更するユーザー Y からの更新要求 (失敗するはずです)

オブジェクト A への変更要求がユーザー Y から Tasty Pie に送信され、ハイドレートのオーバーライドにより、オブジェクト A の作業コピーで所有者が Y に設定されます。

次に、ユーザー Y がオブジェクトを変更できるかどうかを確認するために、リクエストが Authorization オブジェクトに送信されます。私の認証コードはオブジェクトを調べ、オブジェクトの所有者フィールドが Y であることを確認したので、準備完了です。うわぁ!セキュリティホール!

私がやろうと決めたのは、ResourceModel で obj_create() をオーバーライドし、そこで割り当てを行うことでした。ここまでは順調ですね!

例えば

class SmApiNewsItem(ModelResource):
    owner = fields.ForeignKey(SmApiUser, 'owner')
    
    class Meta:
        if SMARF_AUTH_ON:
            authentication = ApiKeyAuthentication()
        authorization = ScsGdnAuthVisibleToAllEditOnlyByOwner()
        queryset = SmModelNewsItems.objects.all()
        resource_name = 'news_item'
        filtering = smMakeFilterAllFieldsFilter(SmModelNewsItems)
        ordering = smMakeOrderingFieldList(SmModelNewsItems)
        serializer = SmarfSerializer()

    def obj_create(self, bundle, **kwargs):
        bundle.data["owner"] = bundle.request.user
        return super(SmApiNewsItem, self).obj_create(bundle, **kwargs)
        

于 2015-03-05T20:22:49.513 に答える
1

どうやら私の愚かな間違いだったようです。

class BooksResource(ModelResource):

    owner= fields.ToOneField(UserResource, 'owner')

    class Meta:
        queryset = Books.objects.all()
        authorizarion = Authorization()

        def hydrate_owner(self, bundle):
            bundle.obj.owner = bundle.request.user.id
            return bundle

間違いはインデントです!hydrate_ownerメソッドであると思われるBooksResourceので、コードを少し変更して動作します:

class BooksResource(ModelResource):

    owner= fields.ToOneField(UserResource, 'owner')

    class Meta:
        queryset = Books.objects.all()
        authorizarion = Authorization()

    def hydrate_owner(self, bundle):
        bundle.data['owner'] = User.objects.get(pk = bundle.request.user.pk)
        return bundle
于 2012-11-19T07:20:13.397 に答える