Какой ответ делать на OPTIONS запрос в CRUD на Django?

У меня есть код, который обрабатывает запросы на django. Он должен отвечать на запросы пользователя. У него прописаны ответы на POST и GET запросы. Но фронтэнд отправляет options запрос, и он не делает никакого ответа. Что мне прописать?

@csrf_exempt
def user_api(request, email=""):

    if request.method=="OPTIONS":
        return
    
    if email == "" and request.method == "GET":
        users = User.objects.all()
        users_serializer = UserSerializer(users, many=True)
        return JsonResponse(users_serializer.data, safe=False)

    elif email == "" and request.method == "POST":
        user_data = JSONParser().parse(request)
        user_serializer = UserSerializer(data=user_data)
        if user_serializer.is_valid():
            user_serializer.save()
            return JsonResponse("New user was created successfully", safe=False)
        else:
            return JsonResponse("Failed to create user", safe=False)

    else:
        # search the specified email and return data in json
        if request.method == "POST":
            try:
                user = User.objects.get(email=email)
                user_serializer = UserSerializer(user, many=False)
                print(user_serializer.data)
                return JsonResponse(user_serializer.data, safe=False)
            except ObjectDoesNotExist:
                return JsonResponse("User does not exists", safe=False)

        elif request.method == "PUT":
            user_data = JSONParser().parse(request)
            user = User.objects.get(email=user_data['email'])  # щоб знати конкретного юзера, інфу якого змінюватимемо
            user_serializer = UserSerializer(user, data=user_data)
            if user_serializer.is_valid():
                user_serializer.save()
                return JsonResponse("User information was updated successfully", safe=False)
            else:
                return JsonResponse("Failed to update user information", safe=False)

        elif request.method == "DELETE":
            user = User.objects.get(email=email)
            user.delete()
            return JsonResponse("User account was deleted successfully", safe=False)

Ответы (1 шт):

Автор решения: AivanF.

В OPTIONS просто возвращайте строку со всеми методами.

И ещё, у вас же куча HTTP-методов в одной функции! Используйте класс с разными методами-обработчиками. Декоратор csrf_exempt на него вешается через другой декоратор method_decorator, и можно на метод dispatch, который вызывается поверх остальных.

class UserView(View):
    allowed_methods = ["options", "get", "put", "post", "delete"]

    @method_decorator(csrf_exempt)
    def dispatch(self, request, *args, **kwargs):
        return super(UserView, self).dispatch(request, *args, **kwargs)

    def options(self, request, id):
        response = HttpResponse()
        response["allow"] = ",".join([self.allowed_methods])
        return response

    def get(self, request, email=""):
        users = User.objects.all()
        users_serializer = UserSerializer(users, many=True)
        return JsonResponse(users_serializer.data, safe=False)

    def put(self, request, email=""):
        user_data = JSONParser().parse(request)
        user = User.objects.get(email=user_data["email"])  # щоб знати конкретного юзера, інфу якого змінюватимемо
        user_serializer = UserSerializer(user, data=user_data)
        if user_serializer.is_valid():
            user_serializer.save()
            return JsonResponse("User information was updated successfully", safe=False)
        else:
            return JsonResponse("Failed to update user information", safe=False)

    def post(self, request, email=""):
        if email == "":
            user_data = JSONParser().parse(request)
            user_serializer = UserSerializer(data=user_data)
            if user_serializer.is_valid():
                user_serializer.save()
                return JsonResponse("New user was created successfully", safe=False)
            else:
                return JsonResponse("Failed to create user", safe=False)

        else:
            # search the specified email and return data in json
            try:
                user = User.objects.get(email=email)
                user_serializer = UserSerializer(user, many=False)
                print(user_serializer.data)
                return JsonResponse(user_serializer.data, safe=False)
            except ObjectDoesNotExist:
                return JsonResponse("User does not exists", safe=False)

    def delete(self, request, email=""):
        user = User.objects.get(email=email)
        user.delete()
        return JsonResponse("User account was deleted successfully", safe=False)

PS: обязательно посмотрите на DRF! Он позволяет значительно сократить объём кода на написание REST API подобного CRUD'a сущностей.

→ Ссылка