Почему это представление Django выполняется дважды на посту? - PullRequest
0 голосов
/ 18 июня 2019

У меня есть вид Django, который подписывает пользователя на бесплатную пробную версию через Stripe. Когда представление делает запрос POST, оно делает это дважды.

Я пробовал ключи идемпотентности, как после строки if request.method == 'POST', так и при первоначальной визуализации представления. У клиента в Stripe всегда есть два идентичных источника оплаты и две идентичные подписки на план.

def start_trial(request):
    title = 'get started'
    description = title
    form = MembershipForm()
    key = settings.STRIPE_PUBLISHABLE_KEY
    trial_days = 30
    coupon = None
    custom_message = ''
    subscription_idempotency = str(uuid.uuid4())
    source_idempotency = str(uuid.uuid4())
    try:
        vendor = Vendor.objects.get(user=request.user)
        custom_message = vendor.message
        coupon = Coupon.objects.get(vendor.coupon)
        coupon = coupon.stripe_coupon_id
        trial_days = vendor.trial_days
    except Vendor.DoesNotExist:
        pass
    try:
        partner = Partner.objects.get(user=request.user)
        custom_message = partner.message
        coupon = Coupon.objects.get(partner.coupon)
        coupon = coupon.stripe_coupon_id
        trial_days = partner.trial_days
    except Partner.DoesNotExist:
        pass
    if request.method == 'POST':
        form = MembershipForm(request.POST)
        if form.is_valid():
            user = request.user
            plan = Membership.objects.get(type_of=form.cleaned_data['plan'])
            # stripe needs to attempt to create a customer
            # TODO what if there's already a membership/subscription?
            user_membership = UserMembership.objects.get(user=request.user)
            stripe_subscription = stripe.Subscription.create(
                customer=user_membership.stripe_customer_id,
                items=[
                    {"plan": plan.stripe_plan_id}
                ],
                trial_period_days=trial_days,
                coupon=coupon,
                idempotency_key=subscription_idempotency,
            )
            subscription = Subscription.objects.create(
                user_membership=user_membership, stripe_subscription_id=stripe_subscription.id)
            subscription.save()
            stripe.Customer.create_source(user_membership.stripe_customer_id,
                                            source=request.POST.get('stripeToken'),
                                            idempotency_key=source_idempotency)
            user_membership.membership = plan
            user_membership.save()
            user.is_subscriber = True
            user.save()

            # if subscription status is incomplete, display error.

            # if passes, redirect to onboarding
            message = 'yay'
            messages.success(request, message=message)
            return HttpResponseRedirect('/onboarding/')
    return render(request, 'memberships/free_trial.html',
                  {'title': title, 'description': description, 'form': form,
                   'key': key, 'custom_message': custom_message})

Данные всегда заканчиваются в Stripe дважды Журнал показывает:

[18/Jun/2019 11:05:21] "POST /memberships/free-trial/ HTTP/1.1" 302 0
[18/Jun/2019 11:05:22] "POST /memberships/free-trial/ HTTP/1.1" 302 0

1 Ответ

0 голосов
/ 18 июня 2019

Спасибо @ duck за указание в правильном направлении.У меня был невидимый (для меня) JavaScript, дублирующий то, что происходило в представлении.Удалил поврежденный файл и проблема решена.

...