如何将数据从回调传递到Django中的另一个视图?

问题描述 投票:0回答:1

我有一个向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)
django callback
1个回答
0
投票

如果我也不喜欢这种情况,可能的解决方案(如果您不能更改API)是

pay视图中:

  • 将请求发送到Erlang
  • 在数据库中为已发送的请求保存一条记录
  • 轮询(带睡眠的循环),直到数据库提示已调用[C​​0]

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

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

© www.soinside.com 2019 - 2024. All rights reserved.