Django Stripe Webhook не согласован с кодом состояния 500, иногда 201
Лос-Анджелес
Я работаю над своим первым проектом на Django и испытываю трудности с интеграцией Stripe. Мой webhook работает непоследовательно — он отлично работал при локальном запуске на localhost с помощью Stripe CLI. Однако после развертывания с помощью Nginx и Unicorn он стал ненадежным. Иногда это происходит, но в большинстве случаев я получаю код состояния 500.
Я хочу отправить электронное письмо клиенту с вложением в формате PDF при запуске веб-приложения checkout.session.completed
. Я читал, что webhook должен возвращать код состояния 200 как можно быстрее; в противном случае время ожидания Stripe может истечь. Или проблема может быть вызвана разницей во времени между запросом и сервером?
Несмотря на это, я не уверен, как это правильно исправить. Я был бы очень признателен за любые советы от кого-нибудь с опытом.
У меня такое чувство, что, может быть, просмотр стоит замедлить?
Трудно понять, где что-то пошло не так, основываясь только на этом - не могли бы вы наладить ведение журнала - возможно, даже с помощью чего-то вроде Sentry, чтобы вы могли легко увидеть, есть ли что-то, что не обрабатывается? тогда поделитесь здесь.
Тем не менее, есть несколько простых способов повысить производительность, которые вы можете сделать здесь. Не зная о вашей базе данных, остальной инфраструктуре, количестве элементов заказа и т.д., которые мы обрабатываем, я не знаю, будут ли они причиной этой проблемы. Но вам все равно стоит подумать о том, как их приготовить.
- попробуйте создать один запрос в вашем главном окне просмотра для продуктов. вместо того, чтобы
.get()
n
количество раз, исходя из вашегоline_items
, возьмите все эти названия продуктов и выполните один запрос -Product.objects.filter(name__in=[YOUR_NAMES])
. повторите их для вашегоOrderItem
все, что вам нужно - вы можете получить все нужные вам продукты с помощью этого ^
filter()
и передать продукты в виде набора запросов функцииsend_email_with_pdf
. Это избавит вас от необходимости снова выполнять все эти.get()
вызовов, каждый из которых является обращением к базе данных. - по вашему мнению, каждый из ваших
OrderItem.objects.create()
вызовов также является новым запросом. вместо. каждый раз, когда вы выполняете итерацию, создавайте экземплярOrderItem
с вашими данными и добавляйте его в список. Затем, когда вы закончите, вызовитеOrderItem.objects.bulk_create([YOUR_ORDER_ITEM_LIST])
со своим списком экземпляров. Опять же, это будет всего лишь одно попадание в базу данных вместоn
Эти 3 идеи значительно улучшат вашу работу с этим представлением, особенно если вы имеете дело с большим количеством продуктов / позиций. Тем не менее, вам поможет дополнительное ведение журнала, и вы можете обнаружить, что вам нужно перенести эту логику отправки электронной почты на что-то в фоновом режиме - сельдерей и т.д.