Преглед на файлове

disable compression to get partial load working

Daniel Sheffield преди 1 година
родител
ревизия
662f3eba63
променени са 6 файла, в които са добавени 31 реда и са изтрити 17 реда
  1. 3 2
      app/rest/CachedLoadingPage.py
  2. 2 1
      app/rest/cherrypy.py
  3. 17 8
      app/rest/pyapi.py
  4. 1 1
      app/rest/templates/done.tpl
  5. 5 1
      app/rest/templates/progress.tpl
  6. 3 4
      app/rest/templates/trend.tpl

+ 3 - 2
app/rest/CachedLoadingPage.py

@@ -44,7 +44,7 @@ class CachedLoadingPage():
     def _start(self) -> None:
         if not self.provider:
             return
-        
+
         self.provider(self.queue)
         self.provider = None
 
@@ -65,5 +65,6 @@ class CachedLoadingPage():
                 self.queue.task_done()
         except Empty:
             pass
-        self._lock.release()
+        finally:
+            self._lock.release()
         return self.value

+ 2 - 1
app/rest/cherrypy.py

@@ -3,7 +3,8 @@ import wsgigzip
 import bottle
 from .pyapi import *
 
-application = wsgigzip.GzipMiddleware(bottle.default_app())
+#application = wsgigzip.GzipMiddleware(bottle.default_app())
+application = bottle.default_app()
 
 cherrypy.config.update({
     'server.socket_host': "0.0.0.0",

+ 17 - 8
app/rest/pyapi.py

@@ -8,8 +8,8 @@ from threading import Thread
 from typing import Union
 from bottle import (
     route, request, response,
-    template, static_file,
-    FormsDict,
+    static_file, redirect,
+    FormsDict, HTTPResponse,
 )
 from psycopg import Cursor, connect
 from psycopg.rows import TupleRow
@@ -18,6 +18,7 @@ from .query_to_xml import get_categories, get_groups, get_products, get_tags
 from .CachedLoadingPage import CachedLoadingPage
 from .Cache import Cache
 from . import trend as worker
+from time import sleep
 
 host = f"host={os.getenv('HOST')}"
 db = f"dbname={os.getenv('DB', 'grocery')}"
@@ -31,6 +32,12 @@ conn = connect(f"{host} {db} {user} {password}")
 def send_static(filename):
     return static_file(filename, root='app/rest/static')
 
+def trend_thread(conn, path, forms):
+    def cb(queue):
+        return Thread(target=worker.trend, args=(
+            queue, conn, path, forms
+        )).start()
+    return cb
 
 @route('/grocery/trend', method=['GET', 'POST'])
 @poison(cache=Cache(10))
@@ -40,19 +47,21 @@ def trend(key: str, forms: FormsDict, cache: Cache):
 
     page = cache[key]
     if page is None:
-        page = cache.add(key, CachedLoadingPage(
-        [],
-        lambda queue: Thread(target=worker.trend, args=(
-            queue, conn, path, forms
-        )).start()
-    ))
+        page = cache.add(key, CachedLoadingPage([], trend_thread(conn, path, forms)))
+    
+    for i in iter_page(page):
+        yield i
+        sleep(0.5)
+
 
+def iter_page(page):
     # copy first to avoid races
     resp = list(page.value)
     pos = len(resp)
     yield ''.join(resp)
     
     while not page.loaded:
+        page.update()
         # all changes since last yield
         resp = list(page.value[pos:])
         pos = pos + len(resp)

+ 1 - 1
app/rest/templates/done.tpl

@@ -1 +1 @@
-<div class="done"/>
+<div class="done"></div>

+ 5 - 1
app/rest/templates/progress.tpl

@@ -1 +1,5 @@
-<div class="progress"><label for="loading-{{stage}}">{{stage}}</label><progress id="loading-{{stage}}" value="{{percent}}" max="100"/></div>
+<div class="progress">
+  <progress id="loading-{{stage}}" value="{{percent}}" max="100"></progress>
+  <br/>
+  <label for="loading-{{stage}}">{{stage}}</label>
+</div>

+ 3 - 4
app/rest/templates/trend.tpl

@@ -32,9 +32,7 @@ body {
   display: none;
 }
 div.progress {
-  display:grid;
-  grid-template-columns: max-content max-content;
-  grid-gap:5px;
+  margin: 1em 0 1em;
 }
 div.progress label {
   text-align:left;
@@ -52,10 +50,11 @@ div.progress:has(+ .done) label:after {
   </head>
   <body align="center">
     <div class="loader-container">
+    <span class="loader"></span>
 % end
 % if end:
     </div>
-    <div class="done"/>
+    <div class="done"></div>
 {{!form}}
 {{!svg}}
     </body>