What response should I make to an OPTIONS request in CRUD on Django?

I have code that handles requests on django. It must respond to user requests. It has registered responses to POST and GET requests. But the frontend sends an options request, and it doesn't make any response. What should I prescribe?

@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)
Author: finally, 2020-11-23

1 answers

In OPTIONS, just return a string with all the methods.

And yet, you have a bunch of HTTP methods in one function! Use a class with different handler methods. The decorator csrf_exempt is hung on it through another decorator method_decorator, and you can use the method dispatch, which is called on top of the others.

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: be sure to look at DRF! It allows you to significantly reduce the amount of code required to write a REST API like CRUD entities.

 3
Author: AivanF., 2020-11-23 18:20:05