如何将数据从回调传递到Django中的另一个视图?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何将数据从回调传递到Django中的另一个视图?相关的知识,希望对你有一定的参考价值。
我有一个向Erlang发出请求的函数。接下来,Erlang将响应发送到url回调。我需要原始函数中的该数据来验证操作是否成功。因此,原始功能必须等待直到答案到达。 mfs_create_and_activate
开始向Erlang发送请求。还有更多功能,添加它们我看不到重点。结果,出现了json,其中有详细的答案,我只需要那里的HTTP代码。如何传输此数据?
原始功能:
def pay(request):
try:
body = request.body.decode('utf-8')
if not body:
raise ValidationError('empty query')
body = json.loads(body)
for field_name in ['phone', 'amount', 'merchant_name', 'payment_type', 'prefix', 'number']:
check_field(body, field_name)
except ValidationError as error:
return JsonResponse({
'status': 'failed',
'errors': {
'code': 400,
'message': error.message
},
})
except JSONDecodeError:
return JsonResponse({
'status': 'failed',
'errors': {
'code': 400,
'message': 'not Json or incorrect Json'
},
})
active_subs = MfsSubscription.objects.filter(
phone=body.get('phone'),
is_subscribe=True,
)
if not active_subs.exists():
response = mfs_create_and_activate(body.get('phone'))
logger.info('activate code = {}'.format(response['code']))
if response is None:
return JsonResponse({
'status': 'failed',
'errors': {
'code': 500,
'message': 'Connection timeout',
},
})
else:
if response['code'] == 201 or response['code'] == 200:
'check data from callback function and next actions'
回调函数:
@csrf_exempt
def callbackpay(request):
try:
data = json.loads(request.body.decode("utf-8"))#here is the answer from Erlang
logger.info('Callback with post data: {}'.format(data))
phone = data['details']['payment_source']['details']['msisdn']
handler = callback_factory(data['action'])
response = JsonResponse({}, status=500)
if handler:
response = handler(phone, data)
return JsonResponse({}, status=response.status_code)
except (
KeyError, Service.DoesNotExist, Service.MultipleObjectsReturned,
MfsSubscription.DoesNotExist,
MfsSubscription.MultipleObjectsReturned
) as e:
logger.error(e)
return JsonResponse({}, status=400)
except Exception as e:
logger.error(e)
return JsonResponse({}, status=500)
答案
如果我也不喜欢这种情况,可能的解决方案(如果您不能更改API)是
在pay
视图中:
- 将请求发送到Erlang
- 在数据库中为已发送的请求保存一条记录
- 轮询(带睡眠的循环),直到数据库提示已调用[C0]
例如,在callbackpay
中,您可以在数据库中存储一些内容以通知结果可用。
如果使用的是内存中解决方案(Redis,memcached等),则可以将这些临时数据存储在内存中,而不用写在数据库记录中
以上是关于如何将数据从回调传递到Django中的另一个视图?的主要内容,如果未能解决你的问题,请参考以下文章
如何将数据从子视图传递到父视图到 SwiftUI 中的另一个子视图?
如何从模型 A 的 CreateView 重定向到模型 B 的另一个 CreateView,同时将关键信息从模型 A 传递到下一个视图?