在Django中,如何限制is_staff成员访问URL?

时间:2018-04-25 10:11:18

标签: python django python-3.x

在我的网站中,用户和管理员用户都从前端登录。现在我想这样做,一些URL仅由公共用户访问。 Is_staff用户无法访问该URL。我该怎么做?

更新:
我可以使用任何装饰器吗?

2 个答案:

答案 0 :(得分:1)

您只需继承LoginRequiredMixin并创建自己的自定义访问mixin,如下所示:

class AccessMixin(LoginRequiredMixin):
    def dispatch(self, request, *args, **kwargs):
        if not request.user.is_authenticated or request.user.is_staff:
            return self.handle_no_permission()
        return super().dispatch(request, *args, **kwargs)

现在您只需要在视图中继承AccessMixin,如下所示:

class HomePageView(AccessMixin, TemplateView):
    login_url = <login-url>
    ...
    ...

因此,匿名用户和员工用户将无法访问该页面的内容。

您也可以在基本模板html

中提及相同内容

考虑您已创建base.html扩展content块,您可以添加如下权限: 防爆。 的 base.html文件

{% if user.is_authenticated %}
    {% if user.is_staff %}
         <h3>Not allowed to access this page</h3>
    {% else %}
         {% block content %} {% endblock %}
    {% endif %}
{% endif %}

这样,当您在模板中扩展base.html时,您在{% block content %} {% endblock %}内编写的所有内容都只会为非员工登录用户呈现。

答案 1 :(得分:1)

如果您想使用装饰器,可以使用user_passes_test。首先定义一个测试函数,检查用户是否不是工作人员。

def is_not_staff(user):
    return not user.is_staff

如果您不希望匿名用户能够访问该视图,您可以更改该功能以检查user.is_authenticated(Django中的user.is_authenticated()&lt; = 1.9)。

然后使用user_passes_test和您的测试功能来装饰您想要保护的视图。

@user_passes_test(is_not_staff)
def non_staff_view(request):
    ...