diff --git a/src/snek/app.py b/src/snek/app.py index 73a0742..525b1ad 100644 --- a/src/snek/app.py +++ b/src/snek/app.py @@ -6,6 +6,7 @@ import uuid import signal from datetime import datetime from contextlib import asynccontextmanager +import aiohttp_debugtoolbar from snek import snode from snek.view.threads import ThreadsView @@ -176,6 +177,8 @@ class Application(BaseApplication): self.on_startup.append(self.start_ssh_server) self.on_startup.append(self.prepare_database) + + async def prepare_stats(self, app): app['stats'] = create_stats_structure() print("Stats prepared", flush=True) @@ -287,9 +290,9 @@ class Application(BaseApplication): self.router.add_view("/login.json", LoginView) self.router.add_view("/register.html", RegisterView) self.router.add_view("/register.json", RegisterView) - self.router.add_view("/drive/{rel_path:.*}", DriveView) - self.router.add_view("/drive.bin", UploadView) - self.router.add_view("/drive.bin/{uid}.{ext}", UploadView) + # self.router.add_view("/drive/{rel_path:.*}", DriveView) + ## self.router.add_view("/drive.bin", UploadView) + # self.router.add_view("/drive.bin/{uid}.{ext}", UploadView) self.router.add_view("/search-user.html", SearchUserView) self.router.add_view("/search-user.json", SearchUserView) self.router.add_view("/avatar/{uid}.svg", AvatarView) @@ -297,25 +300,25 @@ class Application(BaseApplication): self.router.add_get("/http-photo", self.handle_http_photo) self.router.add_get("/rpc.ws", RPCView) self.router.add_get("/c/{channel:.*}", ChannelView) - self.router.add_view( - "/channel/{channel_uid}/attachment.bin", ChannelAttachmentView - ) - self.router.add_view( - "/channel/{channel_uid}/drive.json", ChannelDriveApiView - ) + #self.router.add_view( + # "/channel/{channel_uid}/attachment.bin", ChannelAttachmentView + #) + #self.router.add_view( + # "/channel/{channel_uid}/drive.json", ChannelDriveApiView + #) self.router.add_view( "/channel/{channel_uid}/attachment.sock", ChannelAttachmentUploadView ) self.router.add_view( "/channel/attachment/{relative_url:.*}", ChannelAttachmentView - ) + )# self.router.add_view("/channel/{channel}.html", WebView) self.router.add_view("/threads.html", ThreadsView) self.router.add_view("/terminal.ws", TerminalSocketView) self.router.add_view("/terminal.html", TerminalView) - self.router.add_view("/drive.json", DriveApiView) - self.router.add_view("/drive.html", DriveView) - self.router.add_view("/drive/{drive}.json", DriveView) + #self.router.add_view("/drive.json", DriveApiView) + #self.router.add_view("/drive.html", DriveView) + #self.router.add_view("/drive/{drive}.json", DriveView) self.router.add_get("/stats.html", stats_handler) self.router.add_view("/stats.json", StatsView) self.router.add_view("/user/{user}.html", UserView) @@ -496,6 +499,7 @@ class Application(BaseApplication): raise raised_exception app = Application(db_path="sqlite:///snek.db") +#aiohttp_debugtoolbar.setup(app) async def main(): diff --git a/src/snek/model/channel.py b/src/snek/model/channel.py index 2c17478..e1ea1dd 100644 --- a/src/snek/model/channel.py +++ b/src/snek/model/channel.py @@ -23,7 +23,7 @@ class ChannelModel(BaseModel): history_start_filter = f" AND created_at > '{self['history_start']}' " try: async for model in self.app.services.channel_message.query( - "SELECT uid FROM channel_message WHERE channel_uid=:channel_uid" + history_start_filter + " ORDER BY created_at DESC LIMIT 1", + "SELECT uid FROM channel_message WHERE channel_uid=:channel_uid" + history_start_filter + " ORDER BY id DESC LIMIT 1", {"channel_uid": self["uid"]}, ): diff --git a/src/snek/service/channel_message.py b/src/snek/service/channel_message.py index aae68b9..6c1ae62 100644 --- a/src/snek/service/channel_message.py +++ b/src/snek/service/channel_message.py @@ -1,6 +1,11 @@ from snek.system.service import BaseService from snek.system.template import sanitize_html import time +import asyncio +from concurrent.futures import ThreadPoolExecutor + +executor = ThreadPoolExecutor(max_workers=50) + class ChannelMessageService(BaseService): mapper_name = "channel_message" @@ -69,10 +74,11 @@ class ChannelMessageService(BaseService): "color": user["color"], } ) + loop = asyncio.get_event_loop() try: template = self.app.jinja2_env.get_template("message.html") - model["html"] = template.render(**context) - model['html'] = sanitize_html(model['html']) + model["html"] = await loop.run_in_executor(executor, lambda: template.render(**context)) + model['html'] = await loop.run_in_executor(executor, lambda:sanitize_html(model['html'])) except Exception as ex: print(ex, flush=True) @@ -128,8 +134,10 @@ class ChannelMessageService(BaseService): } ) template = self.app.jinja2_env.get_template("message.html") - model["html"] = template.render(**context) - model['html'] = sanitize_html(model['html']) + + loop = asyncio.get_event_loop() + model["html"] = await loop.run_in_executor(executor, lambda: template.render(**context)) + model['html'] = await loop.run_in_executor(executor, lambda: sanitize_html(model['html'])) return await super().save(model) async def offset(self, channel_uid, page=0, timestamp=None, page_size=30):