BrowserSteps - Faster screenshot updates and enable gzip compression for all content replies in the UI (#1171)

favicon-fix
dgtlmoon 2 years ago committed by GitHub
parent 6d932149e3
commit 51d57f0963
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

@ -27,6 +27,7 @@ from flask import (
session, session,
url_for, url_for,
) )
from flask_compress import Compress as FlaskCompress
from flask_login import login_required from flask_login import login_required
from flask_restful import abort, Api from flask_restful import abort, Api
from flask_wtf import CSRFProtect from flask_wtf import CSRFProtect
@ -51,6 +52,10 @@ app = Flask(__name__,
static_url_path="", static_url_path="",
static_folder="static", static_folder="static",
template_folder="templates") template_folder="templates")
from flask_compress import Compress
# Super handy for compressing large BrowserSteps responses and others
FlaskCompress(app)
# Stop browser caching of assets # Stop browser caching of assets
app.config['SEND_FILE_MAX_AGE_DEFAULT'] = 0 app.config['SEND_FILE_MAX_AGE_DEFAULT'] = 0

@ -210,16 +210,29 @@ def construct_blueprint(datastore: ChangeDetectionStore):
except playwright._impl._api_types.Error as e: except playwright._impl._api_types.Error as e:
return make_response("Browser session ran out of time :( Please reload this page."+str(e), 401) return make_response("Browser session ran out of time :( Please reload this page."+str(e), 401)
p = {'screenshot': "data:image/png;base64,{}".format( # Use send_file() which is way faster than read/write loop on bytes
import json
from tempfile import mkstemp
from flask import send_file
tmp_fd, tmp_file = mkstemp(text=True, suffix=".json", prefix="changedetectionio-")
output = json.dumps({'screenshot': "data:image/png;base64,{}".format(
base64.b64encode(state[0]).decode('ascii')), base64.b64encode(state[0]).decode('ascii')),
'xpath_data': state[1], 'xpath_data': state[1],
'session_age_start': this_session.age_start, 'session_age_start': this_session.age_start,
'browser_time_remaining': round(remaining) 'browser_time_remaining': round(remaining)
} })
with os.fdopen(tmp_fd, 'w') as f:
f.write(output)
response = make_response(send_file(path_or_file=tmp_file,
mimetype='application/json; charset=UTF-8',
etag=True))
# No longer needed
os.unlink(tmp_file)
# @todo BSON/binary JSON, faster xfer, OR pick it off the disk return response
return p
return browser_steps_blueprint return browser_steps_blueprint

@ -1,5 +1,6 @@
flask~=2.0 flask~=2.0
flask_wtf flask_wtf
flask-compress
eventlet>=0.31.0 eventlet>=0.31.0
validators validators
timeago~=1.0 timeago~=1.0

Loading…
Cancel
Save