質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Ajax

Ajaxとは、Webブラウザ内で搭載されているJavaScriptのHTTP通信機能を使って非同期通信を利用し、インターフェイスの構築などを行う技術の総称です。XMLドキュメントを指定したURLから読み込み、画面描画やユーザの操作などと並行してサーバと非同期に通信するWebアプリケーションを実現することができます。

Q&A

解決済

1回答

5013閲覧

python3 cgiとAjaxの連携でプログレスバーを表示したい

namnium1125

総合スコア2043

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Ajax

Ajaxとは、Webブラウザ内で搭載されているJavaScriptのHTTP通信機能を使って非同期通信を利用し、インターフェイスの構築などを行う技術の総称です。XMLドキュメントを指定したURLから読み込み、画面描画やユーザの操作などと並行してサーバと非同期に通信するWebアプリケーションを実現することができます。

0グッド

0クリップ

投稿2017/09/02 02:43

編集2017/09/08 15:37

お世話になります。

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

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

自己解決

python3 http.serverにおけるThreadingの方で無事に解決いたしました。

ありがとうございました。m(_ _)m

投稿2017/09/12 01:07

namnium1125

総合スコア2043

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問