我如何检查基于函数的视图是从另一个重定向函数还是直接从 url 调用的?
How can i check if the function based view was called from another redirect function or directly from the url?
我有一家在线商店,用户在该网店中通过域付款。com/pay并在通过域付款后收到他们的产品。com/done
但是,当我对其进行测试时,我发现用户可以转到 URL 并手动输入域。com/pay 突然之间,他们无需付费即可获得他们的产品!
我想以某种方式检查用户是手动访问还是通过重定向访问它,
如果手动则提高 http403
如果来自重定向那么该功能将正常发生
这是我的process_pay视图
def payment_process(request, trade_id):
trade = get_object_or_404(Trade, id=trade_id)
host = request.get_host()
paypal_dict = {
'business': trade.seller.email,
'amount': Decimal(trade.price),
'item_name': trade.filename,
'invoice': str(trade.id),
'currency_code': 'USD',
'notify_url': 'http://{}{}'.format(host,
reverse('paypal-ipn')),
'return_url': 'http://{}{}/{}'.format(host,
*reverse('payment_done', kwargs={'trade_id': trade.id})),
'cancel_return': 'http://{}{}'.format(host,
reverse('home')),
}
form = PayPalPaymentsForm(initial=paypal_dict)
return render(request, 'payment/payment_process.html', {'trade': trade, 'form': form})
我的done_process观点
@csrf_exempt
def payment_done(request, trade_id):
# if user entered from a redirection:
# Give product to user
# elif user entered manually:
raise http403
# else:
messages.error(request, 'something went wrong')
return redirect('home')
return redirect('trade:inbox')
您可能以错误的方式解决了这个问题,尤其是当它与付款相关时。
在您的 done
视图中,有一个 pre-condition 检查付款是否已经完成。
另一方面,为了回答这个问题,检查用户是否通过重定向登陆或通过手动输入 URL,(一个 hacky 解决方案)在用户中生成一个令牌(一个唯一标识符)本地上下文并将其添加为重定向中的查询参数 URL,进一步验证重定向视图中的令牌(存在于本地上下文中),如果令牌与本地上下文不同或不存在 - 用户手动输入!
我有一家在线商店,用户在该网店中通过域付款。com/pay并在通过域付款后收到他们的产品。com/done
但是,当我对其进行测试时,我发现用户可以转到 URL 并手动输入域。com/pay 突然之间,他们无需付费即可获得他们的产品! 我想以某种方式检查用户是手动访问还是通过重定向访问它,
如果手动则提高 http403 如果来自重定向那么该功能将正常发生
这是我的process_pay视图
def payment_process(request, trade_id):
trade = get_object_or_404(Trade, id=trade_id)
host = request.get_host()
paypal_dict = {
'business': trade.seller.email,
'amount': Decimal(trade.price),
'item_name': trade.filename,
'invoice': str(trade.id),
'currency_code': 'USD',
'notify_url': 'http://{}{}'.format(host,
reverse('paypal-ipn')),
'return_url': 'http://{}{}/{}'.format(host,
*reverse('payment_done', kwargs={'trade_id': trade.id})),
'cancel_return': 'http://{}{}'.format(host,
reverse('home')),
}
form = PayPalPaymentsForm(initial=paypal_dict)
return render(request, 'payment/payment_process.html', {'trade': trade, 'form': form})
我的done_process观点
@csrf_exempt
def payment_done(request, trade_id):
# if user entered from a redirection:
# Give product to user
# elif user entered manually:
raise http403
# else:
messages.error(request, 'something went wrong')
return redirect('home')
return redirect('trade:inbox')
您可能以错误的方式解决了这个问题,尤其是当它与付款相关时。
在您的 done
视图中,有一个 pre-condition 检查付款是否已经完成。
另一方面,为了回答这个问题,检查用户是否通过重定向登陆或通过手动输入 URL,(一个 hacky 解决方案)在用户中生成一个令牌(一个唯一标识符)本地上下文并将其添加为重定向中的查询参数 URL,进一步验证重定向视图中的令牌(存在于本地上下文中),如果令牌与本地上下文不同或不存在 - 用户手动输入!