Предотвращение ошибки при отсутствии ключа в Django Rest Framework
Я создаю API для работы с базой данных и данными email-маркетинга для других моих сайтов.
У меня есть конечная точка для удаления пользователей из базы данных и ActiveCampaign, чтобы предотвратить ошибочные запросы на удаление, я проверяю, есть ли пара key:value
в теле запроса, если 'delete': true
, продолжаем, если нет, я хочу вернуть сообщение об ошибке с кодом статуса, чтобы дать мне (или другим, кого я могу включить в проект в будущем) знать, в чем была ошибка.
Моя проблема: При проверке наличия ключа с именем 'delete'
я получаю ошибку и моя программа перестает работать.
Я хотел бы знать, есть ли способ "делать что-то" только после некоторой проверки, но без нарушения моей программы, если произойдет что-то не ожидаемое, она пошлет ошибку обратно к источнику запроса.
Вот класс/функция, которую я пытаюсь заставить работать:
class Leads(APIView):
@staticmethod
def delete(request):
if request.data["delete"]:
delete_from_db = Lead.objects.filter(email=request.data["email"])
lead = LeadHelper(email=request.data["email"] if request.data["email"] else "")
lead.delete_from_activecampaign()
return Response([delete_from_db], status=status.HTTP_200_OK)
else:
payload = {
"message": "Denied because 'delete': 'true' was not found in request, did you sent this by error?"
}
return Response(payload, status=status.HTTP_401_UNAUTHORIZED)
Моя основная проблема в том, что если нет ключа 'delete'
, то он даже не запускает оператор else
Вот ошибка:
Internal Server Error: /leads/create/
Traceback (most recent call last):
File "/Users/matheus/dev/clients/guardian_api/venv/lib/python3.11/site-packages/django/core/handlers/exception.py", line 55, in inner
response = get_response(request)
^^^^^^^^^^^^^^^^^^^^^
File "/Users/matheus/dev/clients/guardian_api/venv/lib/python3.11/site-packages/django/core/handlers/base.py", line 191, in _get_response
response = wrapped_callback(request, *callback_args, **callback_kwargs)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/Users/matheus/dev/clients/guardian_api/venv/lib/python3.11/site-packages/django/views/decorators/csrf.py", line 54, in wrapped_view
return view_func(*args, **kwargs)
^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/Users/matheus/dev/clients/guardian_api/venv/lib/python3.11/site-packages/django/views/generic/base.py", line 103, in view
return self.dispatch(request, *args, **kwargs)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/Users/matheus/dev/clients/guardian_api/venv/lib/python3.11/site-packages/rest_framework/views.py", line 509, in dispatch
response = self.handle_exception(exc)
^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/Users/matheus/dev/clients/guardian_api/venv/lib/python3.11/site-packages/rest_framework/views.py", line 469, in handle_exception
self.raise_uncaught_exception(exc)
File "/Users/matheus/dev/clients/guardian_api/venv/lib/python3.11/site-packages/rest_framework/views.py", line 480, in raise_uncaught_exception
raise exc
File "/Users/matheus/dev/clients/guardian_api/venv/lib/python3.11/site-packages/rest_framework/views.py", line 506, in dispatch
response = handler(request, *args, **kwargs)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/Users/matheus/dev/clients/guardian_api/leads/views.py", line 47, in delete
if request.data["delete"]:
~~~~~~~~~~~~^^^^^^^^^^
KeyError: 'delete'
[04/Dec/2022 20:59:47] "DELETE /leads/create/ HTTP/1.1" 500 87663
Функция .get()
не будет выбрасывать исключение, если ключ отсутствует; вместо этого она вернет None
.
if request.data.get("delete"):
Или вы можете явно проверить, что ключ присутствует:
if 'delete' in request.data: