Django员工登录所有网址

Kar*_*h A 2 python django django-views python-2.7

我想定义一些以 /staff/* 开头的特定 url 以供员工访问。所以只有员工可以访问以 /staff/* 开头的网址

我如何在 Django 中定义它?

Han*_* He 6

使用自定义中间件。如果 url 以 /staff/ 开头并且 request.user 不是工作人员,则引发 Http404 或向客户端返回一些特殊消息。

下面是一个例子:

对于 Django 版本 < 1.10:

class StaffCheckMiddleware(object):
    def process_request(self, request):
        full_path = request.get_full_path()
        if full_path.startswith('/staff/') and not request.user.is_staff:
            raise Http404      
Run Code Online (Sandbox Code Playgroud)

对于 django 1.10 或更高版本:

class StaffCheckMiddleware(object):
    def __init__(self, get_response):
        self.get_response = get_response

    def __call__(self, request):
        full_path = request.get_full_path()
        if full_path.startswith('/staff/') and not request.user.is_staff:
            raise Http404

        response = self.get_response(request)
        return response
Run Code Online (Sandbox Code Playgroud)

然后添加StaffCheckMiddleware进去settings.py


ett*_*any 6

您可以对与您的 url(以 开头)关联的视图使用user_passes_teststaff_member_required装饰器/staff/,示例可能如下所示:

user_passes_test装饰器:

from django.contrib.auth.decorators import user_passes_test

@user_passes_test(lambda u: u.is_staff, login_url='/some_url/')
def your_view(request, ...):
    # Only for staff
Run Code Online (Sandbox Code Playgroud)

staff_member_required装饰器:

from django.contrib.admin.views.decorators import staff_member_required

@staff_member_required
def your_view(request, ...):
    # Only for staff
Run Code Online (Sandbox Code Playgroud)