Skip to main content
 首页 » 编程设计

python之POST 请求在使用 Plivo 的 Django IVR 中不起作用

2025年05月04日40xing901022

我正在制作一个 IVR(交互式语音响应)系统。我正在使用 Plivo 制作 IVR。我遵循了这个用 Python Flask 编写的示例应用程序。这是制作示例应用程序的链接。

https://www.plivo.com/docs/getting-started/phone-menu-app/

这里是 python flask 中名为 ivr() 的存储库和 View 方法 https://github.com/Chitrank-Dixit/phone-ivr-python/blob/master/app.py#L23

还可以查看代码

@app.route('/response/ivr/', methods=['GET', 'POST']) 
def ivr(): 
    response = plivoxml.Response() 
    if request.method == 'GET': 
        # GetDigit XML Docs - http://plivo.com/docs/xml/getdigits/ 
        getdigits_action_url = url_for('ivr', _external=True) 
        getDigits = plivoxml.GetDigits(action=getdigits_action_url, 
                                       method='POST', timeout=7, numDigits=1, 
                                       retries=1) 
 
        getDigits.addSpeak(IVR_MESSAGE) 
        response.add(getDigits) 
        response.addSpeak(NO_INPUT_MESSAGE) 
 
        return Response(str(response), mimetype='text/xml') 
 
    elif request.method == 'POST': 
        digit = request.form.get('Digits') 
 
        if digit == "1": 
            # Fetch a random joke using the Reddit API. 
            joke = joke_from_reddit() 
            response.addSpeak(joke) 
        elif digit == "2": 
            # Listen to a song 
            response.addPlay(PLIVO_SONG) 
        else: 
            response.addSpeak(WRONG_INPUT_MESSAGE) 
 
        return Response(str(response), mimetype='text/xml') 

我只需要在我的 Django IVR 中有相同的行为。我只是在 Python Django 中实现所有内容。 这是存储库的链接,上面的 ivr() 方法重命名为 ivr_sample() 在 Python Django 中实现。

https://github.com/Chitrank-Dixit/phone-ivr-python/blob/master/app.py#L23

这是代码

@csrf_protect    
def ivr_sample(request): 
    context = { 
        "working": "yes" 
    } 
    response = plivoxml.Response() 
    print type(request.method) , request.POST.get('Digits') 
    if request.method == 'GET': 
        print request.get_host(), request.build_absolute_uri() 
        getdigits_action_url = request.build_absolute_uri() 
        getDigits = plivoxml.GetDigits(action=getdigits_action_url, method='POST', timeout=7, numDigits=1, retries=1) 
        getDigits.addSpeak("Welcome to Sample IVR, Press 0 for sales , Press 1 for support") 
        response.add(getDigits) 
        response.addSpeak("Sorry No Input has been received") 
        return HttpResponse(response, content_type="text/xml") 
 
    elif request.method == 'POST': 
        digit = request.POST.get('Digits') 
 
 
        if (digit == "0" or digit == 0): 
            response.addSpeak("Hello Welcome to Sample , I am a Sales Guy") 
        elif (digit == "1" or digit == 1): 
            response.addSpeak("Hello Welcome to Sample , I am a Support Guy") 
        else: 
            response.addSpeak("Wrong Input Received") 
 
        return HttpResponse(response, content_type="text/xml") 

我可以在我的手机上收听 GET 请求但是当我键入 0 或 1 以便我可以收听所需的消息时。电话挂起,然后连接关闭。这意味着 ivr_sample() 方法正在接受 GET 响应,但在我的例子中它没有运行 POST 响应。基于 Flask 的应用程序运行良好,没有任何问题。

所以我想到Django需要表单中的CSRF保护。所以我使用了 django 文档中指定的 csrf 装饰器。 这是链接:https://docs.djangoproject.com/en/1.8/ref/csrf/

但 IVR 仍然无法正常工作。

最糟糕的是我们无法在本地进行测试。所以只好改正在线测试了。如果有人在 plivo 之前使用 Python Django 制作 IVR。请让我知道我哪里错了。

请您参考如下方法:

好吧,这只是我在尝试所有 csrf 装饰器后想出的一个小修复。在名为 ivr_sample 的 View 中。在 @csrf_protect 的位置,我只需要使用 @csrf_exempt。现在一切正常。