Django Stripe Webhook не согласован с кодом состояния 500, иногда 201

Лос-Анджелес

Я работаю над своим первым проектом на Django и испытываю трудности с интеграцией Stripe. Мой webhook работает непоследовательно — он отлично работал при локальном запуске на localhost с помощью Stripe CLI. Однако после развертывания с помощью Nginx и Unicorn он стал ненадежным. Иногда это происходит, но в большинстве случаев я получаю код состояния 500.

Я хочу отправить электронное письмо клиенту с вложением в формате PDF при запуске веб-приложения checkout.session.completed. Я читал, что webhook должен возвращать код состояния 200 как можно быстрее; в противном случае время ожидания Stripe может истечь. Или проблема может быть вызвана разницей во времени между запросом и сервером?

Несмотря на это, я не уверен, как это правильно исправить. Я был бы очень признателен за любые советы от кого-нибудь с опытом.

полосатая приборная панель sc

У меня такое чувство, что, может быть, просмотр стоит замедлить?

Трудно понять, где что-то пошло не так, основываясь только на этом - не могли бы вы наладить ведение журнала - возможно, даже с помощью чего-то вроде Sentry, чтобы вы могли легко увидеть, есть ли что-то, что не обрабатывается? тогда поделитесь здесь.

Тем не менее, есть несколько простых способов повысить производительность, которые вы можете сделать здесь. Не зная о вашей базе данных, остальной инфраструктуре, количестве элементов заказа и т.д., которые мы обрабатываем, я не знаю, будут ли они причиной этой проблемы. Но вам все равно стоит подумать о том, как их приготовить.

  1. попробуйте создать один запрос в вашем главном окне просмотра для продуктов. вместо того, чтобы .get() n количество раз, исходя из вашего line_items, возьмите все эти названия продуктов и выполните один запрос - Product.objects.filter(name__in=[YOUR_NAMES]). повторите их для вашего OrderItem все, что вам нужно
  2. вы можете получить все нужные вам продукты с помощью этого ^ filter() и передать продукты в виде набора запросов функции send_email_with_pdf. Это избавит вас от необходимости снова выполнять все эти .get() вызовов, каждый из которых является обращением к базе данных.
  3. по вашему мнению, каждый из ваших OrderItem.objects.create() вызовов также является новым запросом. вместо. каждый раз, когда вы выполняете итерацию, создавайте экземпляр OrderItem с вашими данными и добавляйте его в список. Затем, когда вы закончите, вызовите OrderItem.objects.bulk_create([YOUR_ORDER_ITEM_LIST]) со своим списком экземпляров. Опять же, это будет всего лишь одно попадание в базу данных вместо n

Эти 3 идеи значительно улучшат вашу работу с этим представлением, особенно если вы имеете дело с большим количеством продуктов / позиций. Тем не менее, вам поможет дополнительное ведение журнала, и вы можете обнаружить, что вам нужно перенести эту логику отправки электронной почты на что-то в фоновом режиме - сельдерей и т.д.

Вернуться на верх