将 Django "rules" 与 CBV 一起使用似乎不起作用
Using Django "rules" with CBVs doesn't seem to work
每家餐厅可以有多位经理。
class Restaurant(models.Model):
...
managers = models.ManyToManyField(User, related_name='restaurants_which_they_manage')
只有餐厅经理可以更改餐厅列表。我正在使用 django-rules 来强制执行此操作。我有一个谓词可以创建一个很好的冗长 "is_restaurant_manager" 参考:
@rules.predicate
def is_restaurant_manager(user, restaurant):
return user in restaurant.managers.all()
这是权限:
rules.add_perm('restaurants.change_restaurant', is_restaurant_manager)
最后,这是我的看法:
class RestaurantChange(PermissionRequiredMixin, UpdateView):
model = Restaurant
permission_required = 'restaurants.change_restaurant'
fields = ['name', 'description', ]
我有两个测试。
测试 A 检查权限是否正常工作:
self.assertEqual(rules.has_perm('restaurants.change_restaurant', self.user, self.restaurant), True)
第一次测试成功通过。
测试 B 尝试使用有效用户访问 url:
url = reverse('restaurants__restaurant_change', kwargs={'pk': self.restaurant.key,})
response = self.client.get(url)
self.assertEqual(response.status_code, 200)
测试 B 失败,因为我得到了重定向。如果我尝试通过浏览器访问 url,也会发生这种情况。重定向转到登录过程,就好像用户没有访问视图的权限一样。
我的代码有什么问题?
我正在研究 django-rules 看它是否适合项目的需要,运行 进入你在 django-rules 上添加的问题。
在测试中添加 pdb 跟踪并检查您的设置后,我注意到以下内容:
第二个 link 是一个作业,覆盖了之前作业中设置的身份验证后端。
通过将 'rules.permissions.ObjectPermissionBackend'
添加到第二组后端,测试顺利通过。
我在 github 上提出了一个拉取请求来解决这个问题:https://github.com/tavolia/Tavolia/pull/5
干杯!
每家餐厅可以有多位经理。
class Restaurant(models.Model):
...
managers = models.ManyToManyField(User, related_name='restaurants_which_they_manage')
只有餐厅经理可以更改餐厅列表。我正在使用 django-rules 来强制执行此操作。我有一个谓词可以创建一个很好的冗长 "is_restaurant_manager" 参考:
@rules.predicate
def is_restaurant_manager(user, restaurant):
return user in restaurant.managers.all()
这是权限:
rules.add_perm('restaurants.change_restaurant', is_restaurant_manager)
最后,这是我的看法:
class RestaurantChange(PermissionRequiredMixin, UpdateView):
model = Restaurant
permission_required = 'restaurants.change_restaurant'
fields = ['name', 'description', ]
我有两个测试。
测试 A 检查权限是否正常工作:
self.assertEqual(rules.has_perm('restaurants.change_restaurant', self.user, self.restaurant), True)
第一次测试成功通过。
测试 B 尝试使用有效用户访问 url:
url = reverse('restaurants__restaurant_change', kwargs={'pk': self.restaurant.key,})
response = self.client.get(url)
self.assertEqual(response.status_code, 200)
测试 B 失败,因为我得到了重定向。如果我尝试通过浏览器访问 url,也会发生这种情况。重定向转到登录过程,就好像用户没有访问视图的权限一样。
我的代码有什么问题?
我正在研究 django-rules 看它是否适合项目的需要,运行 进入你在 django-rules 上添加的问题。
在测试中添加 pdb 跟踪并检查您的设置后,我注意到以下内容:
第二个 link 是一个作业,覆盖了之前作业中设置的身份验证后端。
通过将 'rules.permissions.ObjectPermissionBackend'
添加到第二组后端,测试顺利通过。
我在 github 上提出了一个拉取请求来解决这个问题:https://github.com/tavolia/Tavolia/pull/5
干杯!