heroku 当我收到发布请求时,如何防止我的值重新启动?

6rqinv9w  于 2022-11-13  发布在  其他
关注(0)|答案(1)|浏览(110)

总的目标是让python程序在收到第一个post请求时,呈现一个html模板,使用JavaScript启动秒表。当python程序收到第二个post请求时,我希望能够及时获取秒表在当前时刻的值。
我本打算使用浏览器的本地存储,但很快意识到,考虑到我将部署到heroku,这不是一个选项。我当前的实现失败,因为每次我返回html模板(或我发送一个新的post请求)时,值都会被重置,并且post请求永远不会发送回我的python脚本(127.0.0.1:5000/test)。

如何在第一次向我的python脚本发出post请求时启动秒表,然后在第二次向我的python脚本发出post请求时获取这些值而不重新启动它?

Python程序-我在这个文件中包含的很少,因为我认为没有必要。请让我知道我是否应该包含更多。

@app.route('/test', methods=['POST'])
def dashboard():
    return render_template('dashboard.html')

dashboard.html

<!DOCTYPE html>
<html>
<body>
    <div id="stopwatch-container">
        <div id="stopwatch">00:00:00</div>
    </div>
    <script>
        var stopwatch = document.getElementById("stopwatch");
        var startBtn = document.getElementById("start-btn");
        var timeoutId = null;
        var ms = 0;
        var sec = 0;
        var min = 0;
        if(ms > 0){
           postHook(sec); 
        } else {
           start(); 
        }
        
        function postHook(sec){
            object = { 
                stopwatchValues: sec 
            }
            fetch("https://127.0.0.1:5000/test", { method: 'POST',body: JSON.stringify(object) })
        }

        /* function to start stopwatch */
        function start(count) {
            timeoutId = setTimeout(function() {
                ms = parseInt(ms);
                sec = parseInt(sec);
                min = parseInt(min);
                console.log(sec)
 
                ms++;
 
                if (ms == 100) {
                    sec = sec + 1;
                    ms = 0;
                }
                if (sec == 60) {
                    min = min + 1;
                    sec = 0;
                }
                if (ms < 10) {
                    ms = '0' + ms;
                }
                if (sec < 10) {
                    sec = '0' + sec;
                }
                if (min < 10) {
                    min = '0' + min;
                }
                if(count == null){
                    count = 69;
                }
                stopwatch.innerHTML = min + ':' + sec + ':' + ms + ' | ' + count;
 
                // calling start() function recursivly to continue stopwatch
                start();
 
            }, 10); // setTimeout delay time 10 milliseconds
        }
    </script>
</body>
</html>
tez616oj

tez616oj1#

这其实并不像你想的那么复杂;执行过程将沿着以下原则。
1.在服务器中创建2个变量(确保在顶层声明,而不是在控制器函数中声明;请随意重命名):first_post(默认值为False)和first_post_time,它们将保存服务器接收到第一个请求时的时间戳。
1.对于POST请求,检查first_post是否为True。如果不是,将其设置为True,您就知道这是第一个POST请求。
1.(如果这是第一个请求),生成一个(当前)时间戳并将其分配给first_post_time,然后像往常一样呈现模板。
1.在任何后续的POST请求中,获取当前时间戳并从first_post_time中减去它。这是第一个用户的秒表上显示的当前时间。使用该值呈现一个模板,或者对它执行任何您想要的操作。

  • 注意:此实现在其他客户端的设备上会有一些延迟,因为最终的HTTP请求可能需要一段时间来处理。如果您需要尽可能高的准确性,请分别考虑实时客户端-服务器-客户端或p2p解决方案,如websockets或WebRTC。*

相关问题