DAV Caching

This commit is contained in:
Jörn-Michael Miehe 2022-10-27 23:32:45 +00:00
parent c0302fbe3c
commit cf812f23cd
6 changed files with 29 additions and 8 deletions

View file

@ -1,7 +1,7 @@
import re
from io import BytesIO, TextIOWrapper
from typing import TextIO
from cache import AsyncTTL
from webdav3.client import Client as WebDAVclient
from .settings import SETTINGS
@ -14,6 +14,7 @@ _WEBDAV_CLIENT = WebDAVclient({
})
@AsyncTTL(time_to_live=SETTINGS.cache_ttl)
async def dav_list_files(regex: re.Pattern, directory: str = "") -> list[str]:
ls = _WEBDAV_CLIENT.list(directory)
return [
@ -23,15 +24,18 @@ async def dav_list_files(regex: re.Pattern, directory: str = "") -> list[str]:
]
@AsyncTTL(time_to_live=SETTINGS.cache_ttl)
async def dav_get_file(path: str) -> BytesIO:
resource = _WEBDAV_CLIENT.resource(path)
buffer = BytesIO()
resource.write_to(buffer)
buffer.seek(0)
return buffer
async def dav_get_textfile(path: str, encoding="utf-8") -> TextIO:
@AsyncTTL(time_to_live=SETTINGS.cache_ttl)
async def dav_get_textfile_content(path: str, encoding="utf-8") -> str:
buffer = await dav_get_file(path)
return TextIOWrapper(buffer, encoding=encoding)
tio = TextIOWrapper(buffer, encoding=encoding)
tio.seek(0)
return tio.read().strip()

View file

@ -2,12 +2,13 @@ import itertools
import random
from typing import Any, Sequence
from ..dav_common import dav_get_textfile
from advent22_api.settings import SETTINGS
from ..dav_common import dav_get_textfile_content
async def get_loesungswort() -> str:
fp = await dav_get_textfile("loesungswort.txt")
return fp.read().strip()
return await dav_get_textfile_content(SETTINGS.solution_filename)
async def get_rnd(bonus_salt: Any = "") -> random.Random:

View file

@ -77,6 +77,7 @@ async def load_image(
# Bild laden
img_buffer = await dav_get_file(images[index])
img_buffer.seek(0)
return await AdventImage.load_standard(img_buffer)

View file

@ -50,6 +50,9 @@ class Settings(BaseSettings):
webdav: DavSettings = DavSettings()
cache_ttl: int = 30
solution_filename: str = "loesungswort.txt"
class Config:
env_file = ".env"
env_file_encoding = "utf-8"

13
api/poetry.lock generated
View file

@ -15,6 +15,14 @@ doc = ["packaging", "sphinx-autodoc-typehints (>=1.2.0)", "sphinx-rtd-theme"]
test = ["contextlib2", "coverage[toml] (>=4.5)", "hypothesis (>=4.0)", "mock (>=4)", "pytest (>=7.0)", "pytest-mock (>=3.6.1)", "trustme", "uvloop (<0.15)", "uvloop (>=0.15)"]
trio = ["trio (>=0.16)"]
[[package]]
name = "async-cache"
version = "1.1.1"
description = "An asyncio Cache"
category = "main"
optional = false
python-versions = ">=3.3"
[[package]]
name = "certifi"
version = "2022.9.24"
@ -316,13 +324,16 @@ python-versions = ">=3.7"
[metadata]
lock-version = "1.1"
python-versions = "^3.10"
content-hash = "eb18799d40638df47cfa261dd96d530cfefdcdc60bde70f156d48820e870a144"
content-hash = "d37ea64eccdac520a3649119169642395eaeeb42ab20668c444774f2baccede3"
[metadata.files]
anyio = [
{file = "anyio-3.6.1-py3-none-any.whl", hash = "sha256:cb29b9c70620506a9a8f87a309591713446953302d7d995344d0d7c6c0c9a7be"},
{file = "anyio-3.6.1.tar.gz", hash = "sha256:413adf95f93886e442aea925f3ee43baa5a765a64a0f52c6081894f9992fdd0b"},
]
async-cache = [
{file = "async-cache-1.1.1.tar.gz", hash = "sha256:81aa9ccd19fb06784aaf30bd5f2043dc0a23fc3e998b93d0c2c17d1af9803393"},
]
certifi = [
{file = "certifi-2022.9.24-py3-none-any.whl", hash = "sha256:90c1a32f1d68f940488354e36370f6cca89f0f106db09518524c88d6ed83f382"},
{file = "certifi-2022.9.24.tar.gz", hash = "sha256:0d9c601124e5a6ba9712dbc60d9c53c21e34f5f641fe83002317394311bdce14"},

View file

@ -15,6 +15,7 @@ uvicorn = {extras = ["standard"], version = "^0.18.3"}
Pillow = "^9.2.0"
numpy = "^1.23.3"
webdavclient3 = "3.14.5"
async-cache = "^1.1.1"
[tool.poetry.dev-dependencies]