diff --git a/files/__main__.py b/files/__main__.py index 4753c400a..8fc68f8b6 100644 --- a/files/__main__.py +++ b/files/__main__.py @@ -6,6 +6,7 @@ import faulthandler from os import environ from sys import argv, stdout +import redis import gevent from flask import Flask from flask_caching import Cache @@ -85,6 +86,8 @@ start_watching_settings() cache = Cache(app) Compress(app) +redis_instance = redis.Redis.from_url(app.config["CACHE_REDIS_URL"]) + from files.routes.allroutes import * if app.config['SERVICE'] == Service.RDRAMA: diff --git a/files/routes/allroutes.py b/files/routes/allroutes.py index 41607bf4f..21d13e31d 100644 --- a/files/routes/allroutes.py +++ b/files/routes/allroutes.py @@ -5,7 +5,7 @@ from files.helpers.config.const import * from files.helpers.settings import get_setting from files.helpers.cloudflare import CLOUDFLARE_AVAILABLE from files.routes.wrappers import * -from files.__main__ import app, limiter, get_CF +from files.__main__ import app, limiter, get_CF, redis_instance @app.before_request def before_request(): @@ -51,8 +51,6 @@ def before_request(): g.nonce = secrets.token_urlsafe(31) -import redis -r = redis.Redis.from_url(app.config["CACHE_REDIS_URL"]) @app.after_request def after_request(response:Response): @@ -64,9 +62,9 @@ def after_request(response:Response): _commit_and_close_db() if request.method == "POST" and not request.path.startswith('/casino/twentyone/'): - r.delete(f'LIMITER/{get_CF()}/{request.endpoint}:{request.path}/1/1/second') + redis_instance.delete(f'LIMITER/{get_CF()}/{request.endpoint}:{request.path}/1/1/second') if user_id: - r.delete(f'LIMITER/{SITE}-{user_id}/{request.endpoint}:{request.path}/1/1/second') + redis_instance.delete(f'LIMITER/{SITE}-{user_id}/{request.endpoint}:{request.path}/1/1/second') return response diff --git a/files/routes/front.py b/files/routes/front.py index 7cff58f8a..45a6aea0b 100644 --- a/files/routes/front.py +++ b/files/routes/front.py @@ -9,7 +9,7 @@ from files.helpers.get import * from files.helpers.sorting_and_time import * from files.helpers.useractions import * from files.routes.wrappers import * -from files.__main__ import app, cache, limiter +from files.__main__ import app, cache, limiter, redis_instance @app.get("/") @app.get("/h/") @@ -48,6 +48,10 @@ def front_all(v, sub=None, subdomain=None): pins = session.get(sort, default) + if not v: + result = cache.get(f'frontpage_{sort}_{t}_{page}_{sub}_{pins}') + if result: return result + ids, total, size = frontlist(sort=sort, page=page, t=t, @@ -65,7 +69,13 @@ def front_all(v, sub=None, subdomain=None): posts = [x for x in posts if not hasattr(x, 'voted') or not x.voted] if v and v.client: return {"data": [x.json for x in posts], "total": total} - return render_template("home.html", v=v, listing=posts, total=total, sort=sort, t=t, page=page, sub=sub, home=True, pins=pins, size=size) + + result = render_template("home.html", v=v, listing=posts, total=total, sort=sort, t=t, page=page, sub=sub, home=True, pins=pins, size=size) + + if not v: + cache.set(f'frontpage_{sort}_{t}_{page}_{sub}_{pins}', result) + + return result LIMITED_WPD_HOLES = ('fights', 'gore', 'aftermath', 'selfharm', 'request', 'meta', 'discussion', 'social', 'music') diff --git a/files/routes/posts.py b/files/routes/posts.py index 2f7d9c450..701dccf45 100644 --- a/files/routes/posts.py +++ b/files/routes/posts.py @@ -28,7 +28,7 @@ from files.routes.wrappers import * from .front import frontlist from .users import userpagelisting -from files.__main__ import app, limiter +from files.__main__ import app, limiter, redis_instance @app.post("/publish/") @limiter.limit('1/second', scope=rpath) @@ -733,6 +733,11 @@ def submit_post(v:User, sub=None): cache.delete_memoized(userpagelisting) g.db.flush() + + key_pattern = app.config["CACHE_KEY_PREFIX"] + 'frontpage_*' + for key in redis_instance.scan_iter(key_pattern): + redis_instance.delete(key) + if v.client: return p.json else: p.voted = 1