如何将数据从回调传递到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
  • 在数据库中为已发送的请求保存一条记录
  • 轮询(带睡眠的循环),直到数据库提示已调用[C​​0]

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

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

以上是关于如何将数据从回调传递到Django中的另一个视图?的主要内容,如果未能解决你的问题,请参考以下文章

如何将数据从子视图传递到父视图到 SwiftUI 中的另一个子视图?

如何将数据值从视图传递到 Django 中的模板?

如何从模型 A 的 CreateView 重定向到模型 B 的另一个 CreateView,同时将关键信息从模型 A 传递到下一个视图?

将数据从一个视图控制器传递到同一视图上的另一个视图控制器

如何将值从 html 传递到 django 中查看?

如何将数据从一个活动传递到android中的另一个活动片段? [复制]