【问题标题】:How to restrict viewing properly in django rest framework如何在 django rest 框架中正确限制查看
【发布时间】:2022-01-13 23:22:23
【问题描述】:

我的应用程序中有一个页面,在 HTML 中,我有以下代码:

{% if job.owner == user.username or user.username == 'admin' %}

这意味着登录用户可以查看他/她在应用程序中创建的作业,管理员用户可以查看所有创建的作业,因为管理员是主用户。

我正在尝试在 django rest 框架中应用相同的逻辑,但它不起作用。现在只是过滤owner=request.user。这仅适用于用户可以查看自己创建的作业,但它也影响了管理员。由于过滤,管理员现在无法查看所有作业。我该如何解决?

这是我的代码:

@api_view(['GET'])
@authentication_classes([TokenAuthentication])
@permission_classes([IsAuthenticated])
def jobs(request):
    job = Job.objects.filter(owner = request.user)
    jobserializer = JobViewSeralizers(job, many = True)
    return Response(jobserializer.data)

【问题讨论】:

    标签: django django-rest-framework


    【解决方案1】:

    不要使用装饰器或 if 尝试使用 middelwares 来限制用户访问:

    # middelwares.py
    
    
    from django.http import HttpResponseRedirect
    from django.contrib import messages
    
    LOGIN_EXEMPT_URLS = [
        '/',
        'api_url/',
    ]
    
    
    class LoginMiddleWare:
        def __init__(self, get_response):
            self.get_response = get_response
    
        def __call__(self, request):
            if not request.user.is_authenticated or request.user != 'admin' and request.path not in LOGIN_EXEMPT_URLS:
                messages.error(request, 'You should login first!', 'warning')
                return HttpResponseRedirect('/')
            response = self.get_response(request)
            return response
    

    并将其添加到设置中:

    # settings.py
    
    MIDDLEWARE = [
        .
        .
        .
    
        'djangoProject_app.middlewares.LoginMiddleWare',
    ]
    
    

    【讨论】:

    • 感谢您的回答,但我在 settings.py 中的诗句不太好。是否可以向我解释这将如何影响我的浏览器端和 API 端?
    • 中间件是一个轻量级插件,在请求和执行响应时进行处理。中间件用于在程序中执行一个功能,这些功能可以是安全、会话、csrf保护、认证等。 Django 为您提供了多种内部中介,也允许我们编写自己的中介。这是 django 文档:docs.djangoproject.com/en/3.2/topics/http/middleware
    • 感谢您的解释和链接
    猜你喜欢
    • 1970-01-01
    • 2021-06-07
    • 1970-01-01
    • 1970-01-01
    • 2021-01-09
    • 1970-01-01
    • 2023-03-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多