2013-01-12 17 views
5

üzerine yardım:Django DİNLENME çerçeve: Bu eğitimde ardından nesne düzeyi izni

# models.py 
class Message(BaseDate): 
    """ 
    Private Message Model 
    Handles private messages between users 
    """ 
    status = models.SmallIntegerField(_('status'), choices=choicify(MESSAGE_STATUS)) 
    from_user = models.ForeignKey(User, verbose_name=_('from'), related_name='messages_sent') 
    to_user = models.ForeignKey(User, verbose_name=_('to'), related_name='messages_received') 
    text = models.TextField(_('text')) 
    viewed_on = models.DateTimeField(_('viewed on'), blank=True, null=True) 


# serialisers.py 
class MessageSerializer(serializers.ModelSerializer): 
    from_user = serializers.Field(source='from_user.username') 
    to_user = serializers.Field(source='to_user.username') 

    class Meta: 
     model = Message 
     fields = ('id', 'status', 'from_user', 'to_user', 'text', 'viewed_on') 


# views.py 
from permissions import IsOwner 

class MessageDetail(generics.RetrieveUpdateDestroyAPIView): 
    model = Message 
    serializer_class = MessageSerializer 
    authentication_classes = (TokenAuthentication, SessionAuthentication) 
    permission_classes = (permissions.IsAuthenticated, IsOwner) 


# permissions.py 
class IsOwner(permissions.BasePermission): 
    """ 
    Custom permission to only allow owners of an object to edit or delete it. 
    """ 

    def has_permission(self, request, view, obj=None): 
     # Write permissions are only allowed to the owner of the snippet 
     return obj.from_user == request.user 


# urls.py 
urlpatterns = patterns('', 
    url(r'^messages/(?P<pk>[0-9]+)/$', MessageDetail.as_view(), name='api_message_detail'), 
) 

Sonra API URL'sini açılış:

http://django-rest-framework.org/tutorial/1-serialization.html

http://django-rest-framework.org/tutorial/4-authentication-and-permissions.html aracılığıyla Bu kodu vardır Bu hatayı alıyorum:

**AttributeError at /api/v1/messages/1/ 
'NoneType' object has no attribute 'from_user'** 

Traceback: 
File "/var/www/sharigo/python/lib/python2.6/site-packages/django/core/handlers/base.py" in get_response 
    111.       response = callback(request, *callback_args, **callback_kwargs) 
File "/var/www/sharigo/python/lib/python2.6/site-packages/django/views/generic/base.py" in view 
    48.    return self.dispatch(request, *args, **kwargs) 
File "/var/www/sharigo/python/lib/python2.6/site-packages/django/views/decorators/csrf.py" in wrapped_view 
    77.   return view_func(*args, **kwargs) 
File "/var/www/sharigo/python/lib/python2.6/site-packages/rest_framework/views.py" in dispatch 
    363.    response = self.handle_exception(exc) 
File "/var/www/sharigo/python/lib/python2.6/site-packages/rest_framework/views.py" in dispatch 
    351.    self.initial(request, *args, **kwargs) 
File "/var/www/sharigo/python/lib/python2.6/site-packages/rest_framework/views.py" in initial 
    287.   if not self.has_permission(request): 
File "/var/www/sharigo/python/lib/python2.6/site-packages/rest_framework/views.py" in has_permission 
    254.    if not permission.has_permission(request, self, obj): 
File "/var/www/sharigo/sharigo/apps/sociable/permissions.py" in has_permission 
    17.   return obj.from_user == request.user 

Exception Type: AttributeError at /api/v1/messages/1/ 
Exception Value: 'NoneType' object has no attribute 'from_user' 

Hiçbiri, isOwner.has_permission() öğesine "obj" parametresi için değer olarak iletiliyor gibi görünüyor. Neyi yanlış yapıyorum? Ben kesinlikle dersi takip ettim. has_permission()obj=None ile çağrıldığında

+0

yılında get_object içeride

def has_object_permission(self, request, view, obj=None): return obj.from_user == request.user 

ve çağrı fonksiyonu check_object_permissions, 'has_object_permission' var/api-guide/permissions/# özel izinler –

cevap

9

kullanıcı bu tip herhangi nesne iznine sahip olup olmadığını dönmek gerekiyordu. Bu yüzden, Hiçbiri geçtiğinde davayı ele almalısın.

def has_permission(self, request, view, obj=None): 
    # Write permissions are only allowed to the owner of the snippet 
    return obj is None or obj.from_user == request.user 
+0

lanet olsun, kafam karıştı çünkü başlangıçta bu durumun işe yaramayacak şekilde kısıtlanmaya neden olduğu görülüyordu. Teşekkür ederim. – nemesisdesign

9

Kullanım işlevi has_object_permission yerine has_permission:

Kodunuz gibi bir şey olmalıdır.

örn: - http://www.django-rest-framework.org görünümleri

DRF 3'te
def get_object(self): 
    obj = get_object_or_404(self.get_queryset()) 
    self.check_object_permissions(self.request, obj) 
    return obj