2013-10-15 32 views
15

olduğunu kontrol edin Bir kullanıcının belirli bir grupta olup olmadığını kontrol eden özel bir izin oluşturmanın en iyi yolunu merak ediyordum. Önceden, kullanıcı nesnesiyle birlikte grup isimlerinin bir tupleını geçmek için kullanabileceğim bir dekoratörüm vardı ve sonra bu kullanıcının belirtilen gruplarda olup olmadığını kontrol ettim.Django REST çerçevesi: Kullanıcının grup

Yani:

def in_group_views(*group_names): 
    """Requires user membership in at least one of the groups passed in.""" 

    def in_groups(u): 
     if u.is_authenticated(): 
      if bool(u.groups.filter(name__in=group_names)) | u.is_superuser: 
       return True 
     return False 

    return user_passes_test(in_groups) 

ben farklı eylemler için farklı grup üyelikleri (POST, PUT, GET) vb

için kontrol edilmesi gereken dikkate alarak, bir viewset için DRF için bu yapardın Nasıl

Çok teşekkürler, Ben

cevap

32

İzin sınıflarını parametrelendirmenin mantıklı yolu, parametreleri görünüm sınıfına koymaktır. Bu, davranışı görünümden görünümüne değiştirmenize izin verir.

def is_in_group(user, group_name): 
    """ 
    Takes a user and a group name, and returns `True` if the user is in that group. 
    """ 
    return Group.objects.get(name=group_name).user_set.filter(id=user.id).exists() 

class HasGroupPermission(permissions.BasePermission): 
    """ 
    Ensure user is in required groups. 
    """ 

    def has_permission(self, request, view): 
     # Get a mapping of methods -> required group. 
     required_groups_mapping = getattr(view, 'required_groups', {}) 

     # Determine the required groups for this particular request method. 
     required_groups = required_groups_mapping.get(request.method, []) 

     # Return True if the user has all the required groups. 
     return all([is_in_group(request.user, group_name) for group_name in required_groups]) 

Sonra şöyle HasGroupPermission sınıfını kullanabilirsiniz:

İşte bir örnek

class MyView(APIView): 
    permission_classes = [HasGroupPermission] 
    required_groups = { 
     'GET': ['moderators', 'members'], 
     'POST': ['moderators'], 
    } 

    ... 

Umut yardımcı olur!

+2

Siz bir beyefendi ve bir alim var, çok teşekkürler! –

+0

Rica ederim. –

+0

Yardımlarınız için teşekkürler –