diff --git a/emmett/helpers.py b/emmett/helpers.py
index 27d021ec..1603c8f5 100644
--- a/emmett/helpers.py
+++ b/emmett/helpers.py
@@ -9,50 +9,27 @@
:license: BSD-3-Clause
"""
-import os
-import re
from typing import Any, List, Optional, Tuple, Union
+from emmett_core._internal import deprecated
from emmett_core.http.helpers import abort as _abort
-from emmett_core.http.response import HTTPFileResponse, HTTPIOResponse
-from pydal.exceptions import NotAuthorizedException, NotFoundException
from .ctx import current
from .html import HtmlTag, tag
-_re_dbstream = re.compile(r"(?P
.*?)\.(?P.*?)\..*")
-
-
def abort(code: int, body: str = ""):
_abort(current, code, body)
+@deprecated("stream_file", "Response.wrap_file")
def stream_file(path: str):
- full_path = os.path.join(current.app.root_path, path)
- raise HTTPFileResponse(full_path, headers=current.response.headers, cookies=current.response.cookies)
+ raise current.response.wrap_file(path)
+@deprecated("stream_dbfile", "Response.wrap_dbfile")
def stream_dbfile(db: Any, name: str):
- items = _re_dbstream.match(name)
- if not items:
- abort(404)
- table_name, field_name = items.group("table"), items.group("field")
- try:
- field = db[table_name][field_name]
- except AttributeError:
- abort(404)
- try:
- filename, path_or_stream = field.retrieve(name, nameonly=True)
- except NotAuthorizedException:
- abort(403)
- except NotFoundException:
- abort(404)
- except IOError:
- abort(404)
- if isinstance(path_or_stream, str):
- raise HTTPFileResponse(path_or_stream, headers=current.response.headers, cookies=current.response.cookies)
- raise HTTPIOResponse(path_or_stream, headers=current.response.headers, cookies=current.response.cookies)
+ raise current.response.wrap_dbfile(db, name)
def flash(message: str, category: str = "message"):
diff --git a/emmett/wrappers/response.py b/emmett/wrappers/response.py
index 46fc1514..efc86cd4 100644
--- a/emmett/wrappers/response.py
+++ b/emmett/wrappers/response.py
@@ -9,16 +9,24 @@
:license: BSD-3-Clause
"""
+import os
+import re
from typing import Any
+from emmett_core.http.response import HTTPFileResponse, HTTPResponse
from emmett_core.http.wrappers.response import Response as _Response
from emmett_core.utils import cachedprop
+from pydal.exceptions import NotAuthorizedException, NotFoundException
+from ..ctx import current
from ..datastructures import sdict
-from ..helpers import get_flashed_messages
+from ..helpers import abort, get_flashed_messages
from ..html import htmlescape
+_re_dbstream = re.compile(r"(?P.*?)\.(?P.*?)\..*")
+
+
class Response(_Response):
__slots__ = ()
@@ -38,3 +46,28 @@ def _meta_tmpl(self):
def _meta_tmpl_prop(self):
return [(key, htmlescape(val)) for key, val in self.meta_prop.items()]
+
+ def wrap_file(self, path) -> HTTPFileResponse:
+ path = os.path.join(current.app.root_path, path)
+ return super().wrap_file(path)
+
+ def wrap_dbfile(self, db, name: str) -> HTTPResponse:
+ items = _re_dbstream.match(name)
+ if not items:
+ abort(404)
+ table_name, field_name = items.group("table"), items.group("field")
+ try:
+ field = db[table_name][field_name]
+ except AttributeError:
+ abort(404)
+ try:
+ filename, path_or_stream = field.retrieve(name, nameonly=True)
+ except NotAuthorizedException:
+ abort(403)
+ except NotFoundException:
+ abort(404)
+ except IOError:
+ abort(404)
+ if isinstance(path_or_stream, str):
+ return self.wrap_file(path_or_stream)
+ return self.wrap_io(path_or_stream)
diff --git a/pyproject.toml b/pyproject.toml
index c5053a58..504776e7 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -149,4 +149,4 @@ dev-dependencies = [
]
[tool.uv.sources]
-emmett-core = { git = "https://github.com/emmett-framework/core", rev = "ab79ed4" }
+emmett-core = { git = "https://github.com/emmett-framework/core", rev = "a0f8ec8" }