Как обработать исключение в Django Middleware? - PullRequest
2 голосов
/ 23 мая 2019

У меня проблема с правильной обработкой исключения в промежуточном программном обеспечении Django.Мое исключение:

from rest_framework.exceptions import APIException
from rest_framework.status import HTTP_403_FORBIDDEN
class MyProfileAuthorizationError(APIException):    
    def __init__(self, msg):
        APIException.__init__(self, msg)
        self.status_code = HTTP_403_FORBIDDEN
        self.message = msg

И мое промежуточное ПО:

class PatchRequestUserWithProfile:
def __init__(self, get_response):
    self.get_response = get_response

def __call__(self, request, *args, **kwargs):
    patch_request_for_nonanon_user(request)
    if not request.user.profile:
        raise MyProfileAuthorizationError("You are not allowed to use this profile.")

    response = self.get_response(request)
    return response

И это исключение выдает 500 вместо 403. Как я могу это исправить?

Ответы [ 3 ]

3 голосов
/ 23 мая 2019

Попробуйте вернуть ответ HttpResponseForbidden вместо исключения исключений

<b>from django.http import HttpResponseForbidden</b>


class PatchRequestUserWithProfile:
    def __init__(self, get_response):
        self.get_response = get_response

    def __call__(self, request, *args, **kwargs):
        patch_request_for_nonanon_user(request)
        if not request.user.profile:
            <b>return HttpResponseForbidden("You are not allowed to use this profile.")</b>

        response = self.get_response(request)
        return response
1 голос
/ 23 мая 2019

Попробуйте с этим исключением:

from rest_framework.exceptions import APIException

class MyProfileAuthorizationError(APIException):
    status_code = 403
    default_detail = 'You are not allowed to use this profile'
    default_code = 'forbidden'

Я думаю, вы не можете этого сделать, прочитайте это: https://groups.google.com/forum/#!topic/django-developers/-ncPqVzF8W8

1 голос
/ 23 мая 2019

Вместо использования Middleware, я думаю, вы должны использовать permissions:

from rest_framework import permissions

class CustomAccessPermission(permissions.BasePermission):
    message = 'You are not allowed to use this profile.'

    def has_permission(self, request, view):
       if not request.user.profile:
           return False
       return True

И добавьте это в DEFAULT_PERMISSION_CLASSES, чтобы сделать его доступным для каждого представления API.

'DEFAULT_PERMISSION_CLASSES': (
   'path.to.CustomAccessPermission',
)
...