お世話になります。
以前質問しましたことを解決する為にいろいろ取り組んでいたのですが、また壁に当たってしまい、もう一度、少し内容を変えて質問させていただきます。ご了承ください。
前回の質問に書いた通り、時間のかかる処理の経過をプログレスバーを表示したいです。
その為に調べているとはてなの方に解決方法っぽいことが書いてありましたので、その通りに取り組んでいました。
ただDjangoに取り組んだことがなく、またすでにhttp.serverのほうでプログラムを組んでしまっていたため(個人使用なのでサーバーとしては十分です。)、cron、celeryではなくデータベースを利用する方法を考えました。
最終的には画像のようにすればいいのかなと思いました。
しかしThreadingでmain.pyを動かしても、インタラクティブモードのときと違い結局main.pyが完了するまで結果が返されず、またos.systemで無理矢理main.pyを動かしても同様でした。
サーバー上でmain.pyの処理をcount.pyから切り離すというのは無理なんでしょうか?
PHPはよくわからないのですが、PHPにあるexec関数みたいなものはpythonにはないのでしょうか?
結局Djangoとceleryを使うしか無いのでしょうか?
以下私が書いてみたコードです。一部前回の質問と同じですが再掲します。
ただ試行錯誤の末ちょっとごちゃごちゃしてしまっています。。
/
├── cgi-bin
│ ├── count.mdb
│ ├── count.py
│ ├── main.py
│ └── reset.py (dbリセット用。本件に関係無し)
├── 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 disp1; 11var disp2; 12var start; 13 14var url = "/cgi-bin/count.py"; 15 16var rT = 0; 17 18if(request){ 19 window.addEventListener("load",function(e){ 20 progress = document.getElementById("prog"); 21 //↓最終的にはこっちで出力したい 22 percent = document.getElementById("percent"); 23 start = document.getElementById("start"); 24 //↓とりあえずこっちに出力 25 disp1 = document.getElementById("disp1"); 26 disp2 = document.getElementById("disp2"); 27 28 start.addEventListener("click",function(e){ 29 30 request.open("GET",url,true); 31 request.onreadystatechange = sub; 32 request.send(null); 33 },false); 34 },false); 35} 36 37function sub(){ 38 disp1.innerHTML = "readyState : " + request.readyState + "<br />status : " + request.status; 39 rT = request.responseText!="" ? request.responseText : rT; 40 disp2.innerHTML = rT; 41 42 console.log("requestText : " + rT); 43 var i = rT.isNaN ? 10 : parseInt(rT); 44 if(i<10&&request.readyState==4){ 45 request.open("GET",url,true); 46 request.onreadystatechange = sub; 47 request.send(null); 48 } 49} 50</script> 51</head> 52<body> 53<progress max="100" value="0" id="prog"></progress> 54<span id="percent">0</span>% 55<br /> 56<button id="start">start</button> 57<br /> 58<br /> 59<div id="disp1"></div> 60<br /> 61<br /> 62<div id="disp2"></div> 63</body> 64</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 4import sqlite3 5from time import sleep 6import traceback 7 8import threading 9import os 10import main 11 12class MainThread(threading.Thread): 13 def run(self): 14 main.main() 15 16def count(): 17 print("Content-type: text/html;charset=utf-8\n") 18 try: 19 connection = sqlite3.connect("./cgi-bin/count.mdb") 20 cursor = connection.cursor() 21 22 cursor.execute("SELECT count FROM table1;") 23 count = cursor.fetchall()[0][0] 24 25 connection.commit() 26 cursor.close() 27 except Exception: 28 traceback.print_exc() 29 30 sleep(1) 31 32 if count == 0: 33 connection = sqlite3.connect("./cgi-bin/count.mdb") 34 cursor = connection.cursor() 35 cursor.execute("UPDATE table1 SET count = 1;") 36 connection.commit() 37 cursor.close() 38 39 T = MainThread() 40 T.start() 41 #os.system("python3 ./cgi-bin/main.py") 42 43 print(count) 44 45 elif count < 10: 46 print(count) 47 elif count >= 10: 48 print("<span>done</span>") 49 50 connection = sqlite3.connect("./cgi-bin/count.mdb") 51 cursor = connection.cursor() 52 cursor.execute("UPDATE table1 SET count = 0;") 53 connection.commit() 54 cursor.close() 55 56 57count()
cgi-bin/main.py
lang
1#!/usr/bin/env python3 2# -*- coding: utf-8 -*- 3 4import sqlite3 5from time import sleep 6 7def main(): 8 for i in range(10): 9 connection = sqlite3.connect("./cgi-bin/count.mdb") 10 cursor = connection.cursor() 11 12 cursor.execute("SELECT count FROM table1;") 13 count = cursor.fetchall()[0][0] 14 15 cursor.execute("UPDATE table1 SET count = ?;",(count+1,)) 16 17 connection.commit() 18 cursor.close() 19 20 sleep(1) 21 22if __name__ == "__main__": 23 main()
回答よろしくお願いします。m(_ _)m
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2017/09/12 01:03