【问题标题】:Django Rest Framework: permissions_classes not workingDjango Rest 框架:permissions_classes 不起作用
【发布时间】:2015-03-09 11:09:17
【问题描述】:

我需要创建一个嵌套路由。看起来像这样api/<campaign-name>/content/<content-id>。我知道有些包(thisthis)会创建嵌套路由。我已经尝试过它们并且相当有限。所以我决定硬连线网址。网址和视图如下:

在 urls.py

# contents
## detail, update, remove
url(
   r'^api/campaign/(?P<campaign>[a-z0-9-]+)/content/(?P<content>\d+)/$',
   ContentAPI.as_view({'get' : 'retrieve', 'put' : 'update', 'delete' : 'destroy'}),
   name = "content-detail"
),
## toggle content verification
url(
   r'^api/campaign/(?P<campaign>[a-z0-9-]+)/content/(?P<content>\d+)/toggle_status/$',
   ContentAPI.as_view(
      {'post' : 'toggle_status'},
      permission_classes = [Or(IsContentManager, IsContentModerator)]
      ),
      name = "content-toggle-status"
),

在views.py

class ContentAPI(viewsets.ModelViewSet):
    permission_classes = [Or(IsContentManager)]
    ... # actions and methods here   

一切正常,但权限似乎不起作用。无需登录系统即可访问 API。如何在我的场景中强制执行权限。

【问题讨论】:

    标签: django django-rest-framework


    【解决方案1】:

    错误在我这边。当我使用 router.register('api/(?P&lt;domain&gt;[a-z0-9]+)/sub-domain/(?P&lt;sub_domain&gt;[a-z0-9]+), SubdomainAPI) 生成嵌套路由时,我必须在 SubdomainAPI 中过滤 domain

    所以我在initial()

    def initial(self, request, *args, **kwargs):     
        self.domain = self._get_domain()
        super(SubdomainAPI, self).initial(request, *args, **kwargs)        
    

    self._get_domain() 检查域是否存在并引发 404 错误。由于在权限检查之前引发了 404 错误,因此我的测试失败了。

    应该是这样的:

    def initial(self, request, *args, **kwargs):          
        super(SubdomainAPI, self).initial(request, *args, **kwargs) 
        self.domain = self._get_domain()       
    

    如果其他人遇到类似问题,希望这会有所帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-02-15
      • 1970-01-01
      • 2016-12-25
      • 1970-01-01
      • 2020-06-07
      • 2020-01-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多