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

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

这是python flask中的存储库和名为ivr()的视图方法
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()方法重命名为在Python Django中实现的ivr_sample()。

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的视图中。在@csrf_protect的地方,我只需要使用@csrf_exempt。现在一切正常。

关于python - POST请求在使用Plivo进行的Django IVR中不起作用,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/31123585/

10-12 22:46