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

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


当用户单击链接时,这就是幕后发生的事情。


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


我希望的是,当用户单击浏览器中的刷新按钮时,将跳过步骤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_data中执行一次代码逻辑的常用技术是什么?

最佳答案

真正的问题是you are updating state in an operation that should be idempotent

正确的解决方案是使用仅接受将处理步骤1&2和then redirect to your template view的POST请求(这意味着您需要HTML表单而不是链接)的专用视图。当然,您将必须将结果(和关联的令牌)存储在某个位置,这样您就可以1.避免为同一令牌重复两次付款,并且2.在模板视图的get_context_data方法中检索与令牌相关的结果。

注意:当然,您也可以在同一视图中处理GET和POST请求,但是TemplateView可能不是最佳选择(实际上,除非需要继承,否则基于类的视图很少是最佳选择-基于函数的视图通常要简单得多)。

关于python - 什么是常用技术,以确保一次执行TemplateView的get_context_data中的代码逻辑?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/52055169/

10-12 22:03