お世話になります。
python3 http.serverを使ってwebアプリケーションを作っていました。
レスポンスに時間が掛かる処理だったので、途中でプログレスバーを表示して残り時間がわかるようにしようと思い、非同期通信を利用しようと考えました。
しかしpythonスクリプトの方で、どうやってレスポンスを複数回返すかわからず、詰まっています。どうすればいいのでしょうか?
print関数で返そうと思うと、スクリプト内のprintすべてが実行されるまで結果が返りません。
なにかいい方法はあるのでしょうか?
進捗は、当然ですがpythonスクリプト側が把握しているものとします。
以下適当ですが私が書いてみたスクリプト群です。やりたいことが伝わるといいのですが。。(^ ^;
/
├── cgi-bin
│ └── count.py
├── index.html
└── server.py
index.html
lang
1<!doctype html> 2<html> 3<head> 4<meta charset="utf-8"> 5<title>Progress By Ajax</title> 6<script> 7var request = new XMLHttpRequest(); 8var progress; 9var percent; 10var start; 11 12if(request){ 13 window.addEventListener("load",function(e){ 14 progress = document.getElementById("prog"); 15 //↓最終的にはこっちで出力したい 16 percent = document.getElementById("percent"); 17 start = document.getElementById("start"); 18 //↓とりあえずこっちに出力 19 disp1 = document.getElementById("disp1"); 20 disp2 = document.getElementById("disp2"); 21 22 start.addEventListener("click",function(e){ 23 var url = "/cgi-bin/count.py" 24 25 request.open("GET",url,true); 26 request.onreadystatechange = function(){ 27 disp1.innerHTML = "readyState : " + request.readyState + "<br />status : " + request.status; 28 // ↓今後isNaNで場合分けして、falseならprogressを進め、trueならhtmlを出力 29 disp2.innerHTML = request.responseText; 30 } 31 request.send(null); 32 },false); 33 },false); 34} 35</script> 36</head> 37<body> 38<progress max="100" value="0" id="prog"></progress> 39<span id="percent">0</span>% 40<br /> 41<button id="start">start</button> 42<br /> 43<br /> 44<div id="disp1"></div> 45<br /> 46<br /> 47<div id="disp2"></div> 48</body> 49</html>
server.py
lang
1import http.server 2import traceback 3 4try: 5 server_address = ("", 8000) 6 handler_class = http.server.CGIHTTPRequestHandler 7 handler_class.cgi_directories = ["/cgi-bin"] 8 server = http.server.HTTPServer(server_address, handler_class) 9 server.serve_forever() 10except: 11 traceback.print_exc()
/cgi-bin/count.py
lang
1#!/usr/bin/env python3 2# -*- coding: utf-8 -*- 3 4from time import sleep 5 6# ↓途中で出力はしてくれない? 7for i in range(100): 8 print(i+1) 9 sleep(1) 10 11print("Content-type: text/html;charset=utf-8\n") 12print("<!doctype html><html><body>done.</body></html>")
わかりにくい質問ですみません。。
回答よろしくお願いします。m(_ _)m
##追記
自分で解法を模索しているうちに、同内容で別な疑問が出てきましたので、
改めてそちらのほうで質問したいと思います。
よろしくお願いします。m(_ _)m
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。