01-arcadia.patch 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263
  1. --- contrib/python/Flask/py3/flask/scaffold.py (index)
  2. +++ contrib/python/Flask/py3/flask/scaffold.py (working tree)
  3. @@ -1,2 +1,3 @@
  4. import importlib.util
  5. +import mimetypes
  6. import os
  7. @@ -12,1 +13,1 @@ from functools import update_wrapper
  8. -from jinja2 import FileSystemLoader
  9. +from jinja2 import ChoiceLoader, FileSystemLoader, ResourceLoader, PackageLoader
  10. @@ -20,2 +21,3 @@ from .cli import AppGroup
  11. from .helpers import locked_cached_property
  12. +from .helpers import send_file
  13. from .helpers import send_from_directory
  14. @@ -97,6 +99,12 @@ class Scaffold:
  15. self.static_folder = static_folder # type: ignore
  16. self.static_url_path = static_url_path
  17. + package_name = import_name
  18. + self.module_loader = pkgutil.find_loader(import_name)
  19. + if self.module_loader and not self.module_loader.is_package(import_name):
  20. + package_name = package_name.rsplit('.', 1)[0]
  21. + self._builtin_resource_prefix = package_name.replace('.', '/')
  22. +
  23. #: The path to the templates folder, relative to
  24. #: :attr:`root_path`, to add to the template loader. ``None`` if
  25. #: templates should not be added.
  26. @@ -313,6 +323,23 @@ class Scaffold:
  27. .. versionadded:: 0.5
  28. """
  29. +
  30. + if self.module_loader is not None:
  31. + from io import BytesIO
  32. + path = os.path.join(self._builtin_resource_prefix, self._static_folder, filename)
  33. + try:
  34. + data = self.module_loader.get_data(path)
  35. + except IOError:
  36. + data = None
  37. + if data:
  38. + mimetype = mimetypes.guess_type(filename)[0]
  39. + max_age = self.get_send_file_max_age(filename)
  40. + fobj = BytesIO(data)
  41. + # Note: in case of uWSGI, might also need to set
  42. + # `wsgi-disable-file-wrapper = true`
  43. + # because, otherwise, uwsgi expects a `fileno` on it.
  44. + return send_file(fobj, mimetype=mimetype, max_age=max_age, conditional=True)
  45. +
  46. if not self.has_static_folder:
  47. raise RuntimeError("'static_folder' must be set to serve static_files.")
  48. @@ -332,7 +357,11 @@ class Scaffold:
  49. .. versionadded:: 0.5
  50. """
  51. if self.template_folder is not None:
  52. - return FileSystemLoader(os.path.join(self.root_path, self.template_folder))
  53. + return ChoiceLoader([
  54. + FileSystemLoader(os.path.join(self.root_path, self.template_folder)),
  55. + PackageLoader(self.import_name, self.template_folder, skip_unknown_package=True),
  56. + ResourceLoader(os.path.join(self._builtin_resource_prefix, self.template_folder), self.module_loader),
  57. + ])
  58. else:
  59. return None