Какой ответ делать на 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 шт):
В 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 сущностей.