我有一个向 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等(,则可以将这些临时数据存储在内存中,而不是写入数据库记录