不调用apply_authorization_limits

Jer*_*y D 5 api django tastypie

我尝试在我的Django应用程序中获取有关我的身份验证用户的详细信息.

为此,我创建了一个新资源:

class MyUserResource(ModelResource):
    class Meta:
        queryset = ReaderUser.objects.all()
        resource_name = 'me'
        list_allowed_methods = []
        detail_allowed_methods = ['get']
        authorization = Authorization()
        authentication = SessionAuthentication()
        excludes = ('password', 'id', 'is_active', 'is_admin', 'last_login')

    def apply_authorization_limits(self, request, object_list):
        print request.user
        return object_list.filter(pk=request.user.pk)

    def prepend_urls(self):
        return [
            url(r"^(?P<resource_name>%s)/$" % self._meta.resource_name, self.wrap_view('dispatch_detail'), name="api_dispatch_detail"),
        ]
Run Code Online (Sandbox Code Playgroud)

当我使用API​​调用我时,/api/me/?format=json 我得到以下内容:More than one resource is found at this URI.

我也试过没有prepend_urls.我不明白的是该print语句永远不会在方法中执行apply_authorization_limits

关于我做错了什么的暗示?

Jer*_*y D 4

我找到了两种方法来解决我的问题:

第一个是两个创建我自己的授权。

就我而言,如下:

from tastypie.authorization import Authorization

class SimpleReaderAuthorization(Authorization):
    def read_list(self, object_list, bundle):
        return object_list.filter(email=bundle.request.user.email)
Run Code Online (Sandbox Code Playgroud)

我只需要更新我的资源:

class MyUserResource(ModelResource):
    class Meta:
        queryset = ReaderUser.objects.all()
        resource_name = 'me'
        list_allowed_methods = ['get']
        authorization = SimpleReaderAuthorization()
        authentication = SessionAuthentication()
        excludes = ('password', 'id', 'is_active', 'is_admin', 'last_login')
Run Code Online (Sandbox Code Playgroud)

另一种简单的方法是执行以下操作,如文档中所示。

def get_object_list(self, request): 
        return super(YourResource, self).get_object_list(request).filter(pk=request.user.pk)
Run Code Online (Sandbox Code Playgroud)

结论:我选择了第二个,因为它更干净、简单。