簡體   English   中英

Django 相當於 Rails cancan 和 devise

[英]Django equivalent of Rails cancan and devise

不久前我用 django 做了項目,然后切換到了 Rails。 我在 Rails 中發現了很多很酷的東西。 我需要將一些功能添加回 django 項目。

Are there  Django equivalent of Rails cancan and devise ?
Is there  Django equivalent of Rails scheduler gem?

更新

對於 django 權限框架,我必須在每個視圖中指定類似

@permission_required('polls.can_vote')
def my_view

我更喜歡 cancan 的方式,我可以在一個地方管理所有權限

  include CanCan::Ability

  def initialize(user)
    user ||= User.new # guest user (not logged in)
    if user.has_role? :admin
      can :manage, :all
    else
      can :manage, :all      
      cannot :users, Swimming::Student
    end   
  end

您可以嘗試使用Django的內置權限框架,而不是cancandevise 它符合您的需求嗎?

在使用 Django 時, Celery可能是延遲和調度的最佳選擇。 django-celery包將 Celery 與 Django 集成。

重新權限像 cancan。

我正在使用djang-rules ,最終結果看起來/功能很像 cancan。

模型/用戶.py

class User(AbstractBaseUser, PermissionsMixin):
    # ...
    def has_perm(self, name, obj=None):
        rset = self.__ruleset
        return rset.test_rule(name, self, obj)

    @property
    def __ruleset(self):
        from models.rules import (
            ManagerRuleSet, EmployeeRuleSet, GuestRuleSet
        )

        if self.group.is_manager:
            return ManagerRuleSet(self)
        elif self.group.is_employee:
            return EmployeeRuleSet(self)
        else:
            return GuestRuleSet(self)

模型/規則.py

from rules import RuleSet


class InvalidUser(Exception):
    pass


class BaseRuleSet(RuleSet):
    def __init__(self, user):
        super()


class ManagerRuleSet(BaseRuleSet):
    def __init__(self, user):
        super()
        if user and not user.group.is_owner:
            raise InvalidUser("instantiated OwnerRuleSet with user in {} group",
                                    user.group.name)

        # Calendar permissions (pass appointment or schedule event)
        self.add_rule('calendar.can_view_calendar', rules.always_true)
        self.add_rule('calendar.can_manage_schedule',
                      is_own | has_accepted_invite)

示例視圖.py

def index(request, id):
    calendar = Calendar.objects.get(id=id)

    if not request.user.has_perm('calendar.can_manage_schedule', calendar):
        return HttpResponseForbidden()
    # ...

django-cancan是 Django 的授權庫,靈感來自 Rails cancan。

首先,您定義每個用戶的能力:

def define_access_rules(user, rules):
    # Anybody can view published articles
    rules.allow('view', Article, published=True)

    if not user.is_authenticated:
        return 

    # ... grant other abilities to logged in user  

然后你可以在視圖中使用它:

class ArticleDetailView(PermissionRequiredMixin, DetailView):
    def get_queryset():
        # this is how you can retrieve all objects that current user can access
        qs = self.request.ability.queryset_for('view', Article)
        return qs

    def has_permission(self):
        article = self.get_object()
        # this is how you can check if user can access an object
        return self.request.ability.can('view', article)

或在模板中:

{% if ability|can:"change"|subject:article %}
    <a href="{% url 'article_edit' pk=article.id %}">Edit article</a>
{% endif %}

Djoser是處理身份驗證和密碼重置的好包。 它是 Django 中設計的替代品

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM