如何在 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
  • 在数据库中保存已发送请求的记录
  • 轮询(循环睡眠(,直到数据库说callbackpay已被调用

例如,在callbackpay中,您可以在数据库中存储一些内容以通知结果可用。

如果您使用的是内存解决方案(Redis,memcached等(,则可以将这些临时数据存储在内存中,而不是写入数据库记录

相关内容

  • 没有找到相关文章

最新更新