Python Django员工登录到所有URL

Python Django员工登录到所有URL,python,django,python-2.7,django-views,Python,Django,Python 2.7,Django Views,我想定义一些以/staff/*开头的特定URL,以便仅由staff访问。因此,只有员工才能访问以/staff开头的URL/* 如何在Django中定义它?使用自定义中间件。如果url以/staff/开头,并且request.user不是staff,则引发Http404或向客户端返回一些特殊消息 以下是一个例子: 对于django版本

我想定义一些以/staff/*开头的特定URL,以便仅由staff访问。因此,只有员工才能访问以/staff开头的URL/*


如何在Django中定义它?

使用自定义中间件。如果url以/staff/开头,并且request.user不是staff,则引发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      
对于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

然后在
settings.py中添加
StaffCheckMiddleware

您可以使用
user\u passes\u test
staff\u member\u required
装饰器来装饰与url关联的视图(以
/staff/
开头),示例如下:

使用
用户通过测试
装饰师:

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
from django.contrib.admin.views.decorators import staff_member_required

@staff_member_required
def your_view(request, ...):
    # Only for staff
需要
员工\u成员
装饰师:

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
from django.contrib.admin.views.decorators import staff_member_required

@staff_member_required
def your_view(request, ...):
    # Only for staff

如果我有20个员工视图,那么我需要将其添加到所有视图中。我认为第一个答案是最好的。我认为对于需要登录的视图,您也可以使用
login\u required
decorator。当然,使用中间件的解决方案也不错。Django 1.10中的错误。在load_middleware mw_instance=中间件(处理程序)类型错误:object()不接受parameters@KareshADjango似乎在1.10中升级了它的中间件风格,我更新了Django 1.10的答案,请检查它是否适合您。注意,这并不像@staff\u member\u所要求的那样严格,这也确保了用户是活跃的