You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
kmftools/bookscraper/app.py

72 lines
1.7 KiB

# app.py
from flask import Flask, request, Response, render_template
import time
import queue
import os
from scraper.book_scraper import BookScraper
from scraper.sites import BookSite
from scraper.logger import add_listener, remove_listener, LOG_BUFFER
app = Flask(__name__)
@app.route("/")
def index():
return render_template("index.html")
# ----------------------------------------------------------
# RUN SCRAPER
# ----------------------------------------------------------
@app.route("/run", methods=["POST"])
def run_scraper():
data = request.json
site = BookSite()
scraper = BookScraper(site, data["url"])
result = scraper.execute()
return {
"title": result["title"],
"buffer": LOG_BUFFER.getvalue()
}
# ----------------------------------------------------------
# REALTIME LOG STREAM (SSE)
# ----------------------------------------------------------
@app.route("/stream")
def stream():
def event_stream():
q = queue.Queue()
# push logregels van BookScraper naar SSE
def listener(line):
q.put(line)
add_listener(listener)
try:
while True:
msg = q.get() # blokkeert totdat logregel binnenkomt
yield f"data: {msg}\n\n"
except GeneratorExit:
pass
finally:
remove_listener(listener)
return Response(event_stream(), mimetype="text/event-stream")
# ----------------------------------------------------------
if __name__ == "__main__":
debug = os.getenv("FLASK_DEBUG", "0") == "1"
host = os.getenv("HOST", "0.0.0.0")
port = int(os.getenv("PORT", "5000"))
app.run(debug=debug, host=host, port=port)