目前,我有以下付款按钮。
<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/