繁体   English   中英

使用Flask从JavaScript代码执行python函数时出错

[英]Error in executing a python function from a javascript code using flask

我正在运行一个python flask应用程序,并且从html页面中调用了javascript文件(使用<script src=....> )。 这是我的html文件:

HTML档案:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title1</title>
    <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0-beta/css/bootstrap.min.css" integrity="sha384-/Y6pD6FV/Vv2HJnA6t+vslU6fwYXjCFtcEpHbNJ0lyAFsXTsjBbfaDjzALeQsN6M" crossorigin="anonymous">
    <script src="https://code.jquery.com/jquery-3.1.1.min.js">
    <script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.11.0/umd/popper.min.js" integrity="sha384-b/U6ypiBEHpOf/4+1nzFpr53nxSS+GLCkfwBdFNTxtclqqenISfwAzpKaMNFNmj4" crossorigin="anonymous"></script>
    <script src="static/chat/js/jquery.timeago.js"></script>
    <script src="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0-beta/js/bootstrap.min.js" integrity="sha384-h0AbiXch4ZDo7tp9hKZ4TsHbi047NrKGLO3SEJAg45jXxnGIfYzk4Si90RDIqNm1" crossorigin="anonymous"></script>
    <script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/socket.io/1.4.8/socket.io.min.js"></script>
    <script data-main="scripts/main" src="require.js"></script>
    <link rel="stylesheet" href="speech.css">

</head>

<body>
<meta charset="UTF-8">
 <nav class="navbar-left" height="100" style="background-color: #092A66 !important;">
      <a class="navbar-brand" padding-top=0 padding-bottom=0 href="#">
        <img src="image.jpg"  height="100" alt="">
      </a>

    </nav>
 <br><br>

 <div class="container">
                <div id="chat" class="jumbotron" style="height:600px;background-color:white">
                    <div id="conversations" style="overflow-y: scroll; height:500px;overflow:auto; ">
                          <div class="arrow"></div>
                              <ul class="ChatLog">
                              </ul>
                          </div>
                    </div>

                    <div id="compose-message">
                        <label for="new-input-message">{{gettext('Message')}}</label>
                        <input type="text" id="new-input-message" class="speech-input" aria-describedby="new-input-message-help-block" name="eng-input" lang = "en" disabled="false">
                        <small id="new-input-message-help-block" class="form-text text-muted">
                          {{gettext('Hit enter to send message')}}
                        </small>
                    </div>
                </div>
</div>
<script src="static/speech-in.js"></script>   
<script async defer src="https://buttons.github.io/buttons.js"></script>
</body>
</html>

<script>

$( document ).ready(function()
{

var socket = io.connect('http://localhost:5000');

// OTHER IMPORTANT CODE FOR FURTHER PROCESSING
 .
 . 
 .
});

</script>

在上面的代码中,我包括socket.iohead中的html文件,然后我包括speech-in.js中,我想使用套接字连接文件。 我当前在speech-in.js代码是:

speech-in.js:

(function() {
    'use strict';

    // check for support (webkit only)
    if (!('webkitSpeechRecognition' in window)) return;

    var talkMsg = 'Speak now';
    // seconds to wait for more input after last
    var defaultPatienceThreshold = 6;

    function capitalize(str) {
        return str.charAt(0).toUpperCase() + str.slice(1);
    }
    console.log('Check 1');
    var inputEls = document.getElementsByClassName('speech-input');

    [].forEach.call(inputEls, function(inputEl) {
        var patience = parseInt(inputEl.dataset.patience, 10) || defaultPatienceThreshold;
        var micBtn, micIcon, holderIcon, newWrapper;
        var shouldCapitalize = true;

        // gather inputEl data
        var nextNode = inputEl.nextSibling;
        var parent = inputEl.parentNode;
        var inputRightBorder = parseInt(getComputedStyle(inputEl).borderRightWidth, 10);
        var buttonSize = 0.8 * (inputEl.dataset.buttonsize || inputEl.offsetHeight);

        // default max size for textareas
        if (!inputEl.dataset.buttonsize && inputEl.tagName === 'TEXTAREA' && buttonSize > 26) {
            buttonSize = 26;
        }

        // create wrapper if not present
        var wrapper = inputEl.parentNode;
        if (!wrapper.classList.contains('si-wrapper')) {
            wrapper = document.createElement('div');
            wrapper.classList.add('si-wrapper');
            wrapper.appendChild(parent.removeChild(inputEl));
            newWrapper = true;
        }
        console.log('Check 2');
        // create mic button if not present
        micBtn = wrapper.querySelector('.si-btn');
        if (!micBtn) {
            micBtn = document.createElement('button');
            micBtn.type = 'button';
            micBtn.classList.add('si-btn');
            micBtn.textContent = 'speech input';
            micIcon = document.createElement('span');
            holderIcon = document.createElement('span');
            micIcon.classList.add('si-mic');
            holderIcon.classList.add('si-holder');
            micBtn.appendChild(micIcon);
            micBtn.appendChild(holderIcon);
            wrapper.appendChild(micBtn);

            // size and position mic and input
            micBtn.style.cursor = 'pointer';
            micBtn.style.top = 0.125 * buttonSize + 'px';
            micBtn.style.height = micBtn.style.width = buttonSize + 'px';
            inputEl.style.paddingRight = buttonSize - inputRightBorder + 'px';
        }

        // append wrapper where input was
        if (newWrapper) parent.insertBefore(wrapper, nextNode);

        console.log('Check 3');

        // GOING TO CALL PYTHON FUNCTION

        $( document ).ready(function(){


        //Receive a new message
        socket.on('speech', function(msg) {
        var time = new Date();
        time_str = time.toLocaleString('en-US', { hour: 'numeric', minute: 'numeric', hour12: true })
             new_msg='<li class="ChatLog__entry"> <img class="ChatLog__avatar" src="static/chat/images/Assistant.png" /> <p class="ChatLog__message"> '+msg+' <time class="ChatLog__timestamp">'+time_str+'</time> </p> </li>'

             $("#conversations ul").append(new_msg)
             $('#new-input-message').prop('disabled', false);

            });

        });

});
    console.log('Check 4');
})();

如您所见,我正在使用socket.on但是它会引发错误,因为socket unrecognizable 我包括socket.io在我班上html文件,我也与其建立连接的html文件,但该连接不在此可见javascript文件。

我还执行了python flask应用程序,该应用程序具有一个合格的路由@socket.on('speech')函数。

我在这里犯了什么错误,我该如何纠正?

socket对象在您speech-in.js文件中不可用,因为它不在全局范围内。

收到connect事件后,应在回调中预订所有socket事件:

var socket = io.connect('http://localhost:5000');

socket.on('connect', function() {

   // subscribe to events here
   socket.on('custom_event_from_flask', function (data) {
      console.log('Event received data:' + JSON.stringify(data));
   });
});

选项之一是将套接字初始化从index.html移到speech-in.js文件中。 但是,如果您希望项目发展,最好更改客户端(JS),使其至少使用JS es6模块进行合理的组织。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM