Django Webhook получает почтовый запрос для Mailgun

Я установил веб-перехватчик в Django для получения обновлений от Mailgun.

Полезная нагрузка POST mailgun доставляется на веб-перехватчик в следующем формате:

{
  “signature”:
  {
    "timestamp": "1529006854",
    "token": "a8ce0edb2dd8301dee6c2405235584e45aa91d1e9f979f3de0",
    "signature": "d2271d12299f6592d9d44cd9d250f0704e4674c30d79d07c47a66f95ce71cf55"
  }
  “event-data”:
  {
    "event": "opened",
    "timestamp": 1529006854.329574,
    "id": "DACSsAdVSeGpLid7TN03WA",
    // ...
  }
}

Если я попытаюсь получить параметр event, используя приведенный ниже код, я получаю сообщение об ошибке TypeError: объект 'method' не подлежит подписке

@csrf_exempt
@require_POST
def mailgun(request):
    event_data = request.POST.get['event-data']['event']
    return HttpResponse(event_data, status=200)

Любая помощь приветствуется.


person Rutnet    schedule 07.09.2020    source источник


Ответы (2)


Попробуйте обновить .get, чтобы вызвать функцию и добавить несколько проверок ввода, например:

if request.POST.get('event-data'):
    event_data = request.POST.get('event-data')['event']
    return HttpResponse(event_data, status=200)
else:
    return HttpResponse("[unknown event]", status=400)

или если вы уверены, что event-data никогда не будет пустым или нулевым, вызовите напрямую:

request.POST['event-data']['event']
person ujlbu4    schedule 07.09.2020
comment
Если я запустил первую команду, я получаю: TypeError: объект 'NoneType' не подлежит подписке - person Rutnet; 07.09.2020
comment
@Rutnet, возможно ли получить event-data, который пуст? - person ujlbu4; 07.09.2020
comment
@Rutnet обновил мой ответ расширенными примерами (с ответом с кодом состояния 400, если входящие данные не такие, как вы ожидали) - person ujlbu4; 07.09.2020
comment
Я думаю, что данные о событии не возвращаются должным образом. Это структура файла event_data documentation.mailgun.com/en/latest/user_manual .html # webhooks - person Rutnet; 07.09.2020
comment
Хорошо, не могли бы вы показать (print(dict(request.POST))), что вы на самом деле получаете от mailgun? - person ujlbu4; 07.09.2020
comment
Давайте продолжим это обсуждение в чате. - person ujlbu4; 07.09.2020

После долгого устранения неполадок ответ был скрыт в ссылке на StackOverflow ниже. В Python 3.0 - Python 3.5.x json.loads () будет принимать только строку Unicode, поэтому вы должны декодировать request.body (который является байтовой строкой) перед передачей его в json.loads ().

Попытка разобрать `request.body` из POST в Django

body_unicode = request.body.decode('utf-8')
body = json.loads(body_unicode)
content = body['event-data']
recipient = content['recipient']
person Rutnet    schedule 09.09.2020