我为我的 Django 站点编写了一个单独的应用程序,restricted
名为
http://localhost:8000/restricted/
我希望能够将整个应用程序的访问权限限制为仅限特定组的成员(我们称之为“受限组”)。
有没有办法轻松做到这一点?也许在urls.conf
文件中?该应用程序充满了基于类的列表视图(30+),所以我不想将这种检查应用于我view.py
文件中的每个视图。
编辑:为了解决这个问题,我在视图中添加了一个函数:
def group_check(user):
if user:
return user.groups.filter(name='Restricted').count() >= 1
return False
对于任何普通视图(例如index
),我将装饰器放在:
@user_passes_test(group_check)
def index(request):
return render_to_response('listview/index.html')
对于我的基于类的列表视图:
class MyListView1(ListView):
context_object_name = "objs"
queryset = MyList.objects.all()
template_name = "listviews/mylist.html"
@method_decorator(user_passes_test(group_check))
def dispatch(self, *args, **kwargs):
return super(MyListView1, self).dispatch(*args, **kwargs)
对于具有重新定义的查询集的那些:
class MyListView1_Custom(ListView):
context_object_name = "obj"
template_name = "listviews/mylist_custom.html"
@method_decorator(user_passes_test(group_check))
def get_queryset(self):
self.obj1 = get_object_or_404(MyList, id__iexact=self.args[0])
self.context = {}
self.context['custom'] = self.obj1
return self.context
当然,这将需要您导入:
from django.utils.decorators import method_decorator
from django.contrib.auth.decorators import user_passes_test
经过测试,我得出结论,这是一种合适的基于组的视图保护方法。任何不属于“受限”组的用户都会被重定向到默认登录页面。
您可以在 Django 的文档页面找到更多信息:user_passes_test,其中还描述了如何将它们重定向到不同的位置(如果您愿意,可以使用它来重定向到 404)。