2011-04-04 68 views
6

Django的用戶羣我瞭解基本的用戶認證,登錄,創建帳戶,擴展用戶模型...與裝飾VS許可

我想創建一個網站,教師和學生可以登錄。教師將有機會獲得頁面的學生不能訪問權後的家庭作業等...

我認爲這是可能的做到這一點:

  1. 在創建用戶分配到特定的組。
  2. 使用裝飾器來限制對相應組的訪問。

@login_required 
@user_passes_test(not_in_student_group, login_url='/login/') 
def some_view(request): 
    # ... 

def not_in_student_group(user): 
if user: 
    return user.groups.filter(name='Student').count() == 0 
return False 

筆記,我從上面的代碼:

http://bradmontgomery.blogspot.com/2009/04/restricting-access-by-group-in-django.html

問:

  1. 如何使用許可,並從上面的方法有什麼不同?

  2. 如何使用權限以及定義權限如何幫助我實現上述結果? (如果有可能的話,它應該被使用?)

回答

4

似乎有一百方式,人們得到在Django關於授權和權限相同的結果。絕對是團隊的一種方式。

Django權限通常基於您的數據,所以「基於表」或「基於行」。基於行的權限不是Django原生的,你必須推出你自己的解決方案,或者使用類似django-guardian或django-authority More Here的東西。

權限的文檔是here

class Quiz(models.Model): 
    title = models.CharField(max_length=64) 

    class Meta: 
     permissions = (
      ("can_take_quiz", "Can take quiz"), 
      ("can_grade_quiz", "Can Grade Quiz"), 
     ) 

在這種模式下,這些權限,你可以看到,可能是學生的助手將被獲准級特定的測驗,或給定的老師測驗,這是基於行的權限將會有用的地方。實現類似的東西(通過has_permission)可以解決問題(並且更明確),而不僅僅是將用戶添加到組中。

您可以像用戶一樣將用戶添加到組中,然後爲整個組添加權限以添加測驗或等級測驗(教師可以添加/編輯/刪除/評分,學生可以採取的測驗)在那。

那麼你的user_passes_test應該是user.has_perm('quiz.take_quiz')或者不是裝飾者,你可以將特定的測驗傳遞給基於對象的後端。