代码之家  ›  专栏  ›  技术社区  ›  Cheok Yan Cheng

什么是常见的技术,以确保TemplateView的get-context数据中的代码逻辑被执行一次?

  •  1
  • Cheok Yan Cheng  · 技术社区  · 6 年前

    目前,我有以下付款按钮。

    <a href="https://localhost/subscribe/?payload_nonce=token123">PAY NOW</a>
    

    当用户点击链接时,下面是场景背后发生的事情。

    1. 从用户获取令牌输入。
    2. 支付网关处理接收到的令牌,并返回成功/失败结果。
    3. 向用户显示成功/失败结果。

    我希望,当用户单击浏览器中的“刷新”按钮时,将跳过步骤1和步骤2。

    我们不希望用户重复付款。

    但是,只显示以前的网关成功/失败结果。


    这里是 TemplateView 代码。

    class SubscribeView(TemplateView):
        template_name = 'subscribe.html'
    
        def get_context_data(self, **kwargs):
            # Call the base implementation first to get a context
            context = super(SubscribeView, self).get_context_data(**kwargs)
    
            # Step 1: Get token input from user
            #
            payload_nonce = self.request.GET.get('payload_nonce')
    
    
            # Step 2: Payment gateway processes the 
            #         received token, and return success/fail result.
            ...
            ...
            ##############################
            # Submit it to payment gateway
            ##############################
            ...
            ...
    
    
            # Step 3: Display success/fail result to user.
            #
            context['is_success'] = result.is_success
            context['message'] = result.message
    
            return context
    

    我可以知道,什么是常见的技术,以确保TemplateView的get-context数据中的代码逻辑被执行一次吗?

    2 回复  |  直到 6 年前
        2
  •  0
  •   Cheok Yan Cheng    6 年前

    from django.views.generic import TemplateView
    from django.views.generic import View
    
    class SubscribeView(View):
        def post(self, request):
            # Step 1: Get token input from user
            #
            payload_nonce = self.request.POST.get("payload_nonce")
    
    
            # Step 2: Payment gateway processes the 
            #         received token, and return success/fail result.
            ...
            ...
            ##############################
            # Submit it to payment gateway
            ##############################
            ...
            ...
    
            # Redirect to SubscribeDoneView, for page rendering purpose.
            return redirect(reverse('subscribe_done') + query_string)
    
    
    class SubscribeDoneView(TemplateView):
        template_name = 'subscribe_done.html'
    
        def get_context_data(self, **kwargs):
            # Call the base implementation first to get a context
            context = super(SubscribeDoneView, self).get_context_data(**kwargs)
    
            # Step 3: Display success/fail result to user.
            #
            is_success = (self.request.GET.get('is_success') == 'True')
            message = self.request.GET.get('message')
    
            context['is_success'] = is_success
            if is_success is False and message is not None:
                context['message'] = message
    
            return context