[英]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的內置權限框架,而不是cancan
和devise
。 它符合您的需求嗎?
在使用 Django 時, Celery可能是延遲和調度的最佳選擇。 有django-celery包將 Celery 與 Django 集成。
重新權限像 cancan。
我正在使用djang-rules ,最終結果看起來/功能很像 cancan。
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)
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)
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.