2015-03-09 3 views
1

Мне нужно создать вложенный маршрут. Что выглядит примерно так: api/<campaign-name>/content/<content-id>. Я знаю, что есть пакеты (this и this), которые создают вложенные маршруты. Я пробовал их и довольно ограничен. Поэтому я решил жестко связать URL-адреса. В URLs и мнения приведены ниже:Django Rest Framework: permissions_classes не работает

В 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 возможен без входа в систему. Как обеспечить соблюдение разрешений в моем сценарии.

ответ

0

Ошибка была на моей стороне. Поскольку я генерировал вложенный маршрут, используя router.register('api/(?P<domain>[a-z0-9]+)/sub-domain/(?P<sub_domain>[a-z0-9]+), SubdomainAPI), мне пришлось фильтровать domain в SubdomainAPI.

Так что я сделал это на 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()  

Надеется, что это будет полезно, если другое Stumbleupon подобной проблемы.

Смежные вопросы