Почему Flask не возвращает JSON в браузер пользователя в приложении Chatbot? - PullRequest
0 голосов
/ 06 июля 2019

Я работал над следующим учебником: https://pusher.com/tutorials/chatbot-flask-dialogflow

Это простое приложение чата с флягой, в котором пользователь запрашивает сведения о фильме.

Запрос пользователязатем отправляется в Dialogflow API.DialogFlow расшифровывает намерения пользователя, а затем отправляет запрос JSON-сообщения в /get_movie_detail.

Здесь колба подключается к API IMDB и получает сведения о фильме, который интересует пользователя.

Фильмдетали должны быть возвращены пользователю.

Приложение работает до тех пор, пока детали фильма не должны быть возвращены пользователю, но по какой-то причине эта часть не работает:

enter image description here

from flask import Flask, request, jsonify, render_template
import os
import dialogflow
import requests
import json


def detect_intent_texts(project_id, session_id, text, language_code):
        session_client = dialogflow.SessionsClient()
        session = session_client.session_path(project_id, session_id)

        if text:
            text_input = dialogflow.types.TextInput(
                text=text, language_code=language_code)
            query_input = dialogflow.types.QueryInput(text=text_input)
            response = session_client.detect_intent(
                session=session, query_input=query_input)



            return response.query_result.fulfillment_text


credential_path = "/Users/will/Documents/Laura/movie_bot/movie-bot-twrobf-6efd82e3249a7.json"
os.environ['GOOGLE_APPLICATION_CREDENTIALS'] = credential_path            

app = Flask(__name__)

@app.route('/')
def index():
    return render_template('index.html')


@app.route('/get_movie_detail', methods=['POST'])
def get_movie_detail():
    data = request.get_json(silent=True)
    movie = data['queryResult']['parameters']['movie']

    api_key = 'ac95c504'

    movie_detail = requests.get('http://www.omdbapi.com/?t={0}&apikey={1}'.format(movie, api_key)).content

    movie_detail = json.loads(movie_detail.decode('utf-8'))


    response =  """
            Title : {0}
            Released: {1}
            Actors: {2}
            Plot: {3}
        """.format(movie_detail['Title'], movie_detail['Released'], movie_detail['Actors'], movie_detail['Plot'])


    reply = {
            "message": response
        }

    return jsonify(reply)


@app.route('/send_message', methods=['POST'])    
def send_message():
    message = request.form['message']
    project_id='movie-bot-twekbf'
#    project_id = os.getenv('DIALOGFLOW_PROJECT_ID')
    fulfillment_text = detect_intent_texts(project_id, "unique", message, 'en')
    if fulfillment_text:        
        response_text = { "message":  fulfillment_text }    
        return jsonify(response_text)
    else:
        return jsonify({"message": "bear with me..."})

# run Flask app
if __name__ == "__main__":
    app.run()

Кроме того, вот код jquery, который обрабатывает ответы json и отображает их в браузере

function submit_message(message) {
        $.post( "/send_message", {message: message}, handle_response);

        function handle_response(data) {
          // append the bot repsonse to the div
          $('.chat-container').append(`
                <div class="chat-message col-md-5 offset-md-7 bot-message">
                    ${data.message}
                </div>
          `)
          // remove the loading indicator
          $( "#loading" ).remove();
        }
    }


// /static/custom.js

    $('#target').on('submit', function(e){
        e.preventDefault();
        const input_message = $('#input_message').val()
        // return if the user does not enter any text
        if (!input_message) {
          return
        }

        $('.chat-container').append(`
            <div class="chat-message col-md-5 human-message">
                ${input_message}
            </div>
        `)

        // loading 
        $('.chat-container').append(`
            <div class="chat-message text-center col-md-2 offset-md-10 bot-message" id="loading">
                <b>...</b>
            </div>
        `)

        // clear the text input 
        $('#input_message').val('')

        // send the message
        submit_message(input_message)
    });

Я знаю, что колба успешно извлекаетсядетали фильма из IMDB, потому что, если я добавлю в код детали печати фильма, как показано ниже:

    movie_detail = json.loads(movie_detail.decode('utf-8'))


    response =  """
            Title : {0}
            Released: {1}
            Actors: {2}
            Plot: {3}
        """.format(movie_detail['Title'], movie_detail['Released'], movie_detail['Actors'], movie_detail['Plot'])


    reply = {
            "message": response
        }


    print(response)
    return jsonify(reply)

... Ожидаемая информация о фильме отображается в моей IDE.

enter image description here

Однако по какой-либо причине детали фильма не возвращаются в браузер с

return jsonify(reply)

Кроме того, я проверяю приложение локально, когда проверяюПохоже, что инструменты разработчика Chrome / get_movie_detail ничего не возвращают в браузер:

enter image description here

Кто-нибудь может помочь?Большое спасибо заранее.

1 Ответ

0 голосов
/ 07 июля 2019

Проблема в том, что возвращаемый вами JSON не соответствует формату JSON, ожидаемому Dialogflow.Похоже, вы перепутали JSON, который должны отправлять get_movie_detail() и send_message().

Функция send_message() вызывается в более поздней части учебника и не связана с Dialogflow.

Вместо этого Dialogflow настроен для вызова get_movie_detail().Строки, которые устанавливают переменную reply, должны устанавливать параметр с именем fulfillmentText.Это должно выглядеть примерно так:

    reply = {
        "fulfillmentText": response,
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...