|
@@ -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):
|
|
|
|
|
|
resp = list(page.value)
|
|
|
pos = len(resp)
|
|
|
yield ''.join(resp)
|
|
|
|
|
|
while not page.loaded:
|
|
|
+ page.update()
|
|
|
|
|
|
resp = list(page.value[pos:])
|
|
|
pos = pos + len(resp)
|