forked from orbit-oss/flask
Added _PackageBoundObject.get_static_file_options.
This method receives the name of a static file that is going to be served up and generates a dict of options to use when serving the file. The default set is empty so code will fall back to the existing behavior if the method is not overridden. I needed this method to adjust the cache control headers for .js files that one of my applications was statically serving. The default expiration is buried in an argument to send_file and is set to 12 hours. There was no good way to adjust this value previously.
This commit is contained in:
parent
8d7ca29a35
commit
06b224676d
2 changed files with 34 additions and 3 deletions
|
|
@ -495,7 +495,8 @@ def send_from_directory(directory, filename, **options):
|
||||||
filename = safe_join(directory, filename)
|
filename = safe_join(directory, filename)
|
||||||
if not os.path.isfile(filename):
|
if not os.path.isfile(filename):
|
||||||
raise NotFound()
|
raise NotFound()
|
||||||
return send_file(filename, conditional=True, **options)
|
options.setdefault('conditional', True)
|
||||||
|
return send_file(filename, **options)
|
||||||
|
|
||||||
|
|
||||||
def get_root_path(import_name):
|
def get_root_path(import_name):
|
||||||
|
|
@ -651,6 +652,11 @@ class _PackageBoundObject(object):
|
||||||
return FileSystemLoader(os.path.join(self.root_path,
|
return FileSystemLoader(os.path.join(self.root_path,
|
||||||
self.template_folder))
|
self.template_folder))
|
||||||
|
|
||||||
|
def get_static_file_options(self, filename):
|
||||||
|
"""Function used internally to determine what keyword arguments
|
||||||
|
to send to :func:`send_from_directory` for a specific file."""
|
||||||
|
return {}
|
||||||
|
|
||||||
def send_static_file(self, filename):
|
def send_static_file(self, filename):
|
||||||
"""Function used internally to send static files from the static
|
"""Function used internally to send static files from the static
|
||||||
folder to the browser.
|
folder to the browser.
|
||||||
|
|
@ -659,7 +665,8 @@ class _PackageBoundObject(object):
|
||||||
"""
|
"""
|
||||||
if not self.has_static_folder:
|
if not self.has_static_folder:
|
||||||
raise RuntimeError('No static folder for this object')
|
raise RuntimeError('No static folder for this object')
|
||||||
return send_from_directory(self.static_folder, filename)
|
return send_from_directory(self.static_folder, filename,
|
||||||
|
**self.get_static_file_options(filename))
|
||||||
|
|
||||||
def open_resource(self, resource, mode='rb'):
|
def open_resource(self, resource, mode='rb'):
|
||||||
"""Opens a resource from the application's resource folder. To see
|
"""Opens a resource from the application's resource folder. To see
|
||||||
|
|
|
||||||
|
|
@ -17,7 +17,7 @@ import unittest
|
||||||
from logging import StreamHandler
|
from logging import StreamHandler
|
||||||
from StringIO import StringIO
|
from StringIO import StringIO
|
||||||
from flask.testsuite import FlaskTestCase, catch_warnings, catch_stderr
|
from flask.testsuite import FlaskTestCase, catch_warnings, catch_stderr
|
||||||
from werkzeug.http import parse_options_header
|
from werkzeug.http import parse_cache_control_header, parse_options_header
|
||||||
|
|
||||||
|
|
||||||
def has_encoding(name):
|
def has_encoding(name):
|
||||||
|
|
@ -204,6 +204,30 @@ class SendfileTestCase(FlaskTestCase):
|
||||||
self.assert_equal(value, 'attachment')
|
self.assert_equal(value, 'attachment')
|
||||||
self.assert_equal(options['filename'], 'index.txt')
|
self.assert_equal(options['filename'], 'index.txt')
|
||||||
|
|
||||||
|
def test_static_file(self):
|
||||||
|
app = flask.Flask(__name__)
|
||||||
|
# default cache timeout is 12 hours (hard-coded)
|
||||||
|
with app.test_request_context():
|
||||||
|
rv = app.send_static_file('index.html')
|
||||||
|
cc = parse_cache_control_header(rv.headers['Cache-Control'])
|
||||||
|
self.assert_equal(cc.max_age, 12 * 60 * 60)
|
||||||
|
# override get_static_file_options with some new values and check them
|
||||||
|
class StaticFileApp(flask.Flask):
|
||||||
|
def __init__(self):
|
||||||
|
super(StaticFileApp, self).__init__(__name__)
|
||||||
|
def get_static_file_options(self, filename):
|
||||||
|
opts = super(StaticFileApp, self).get_static_file_options(filename)
|
||||||
|
opts['cache_timeout'] = 10
|
||||||
|
# this test catches explicit inclusion of the conditional
|
||||||
|
# keyword arg in the guts
|
||||||
|
opts['conditional'] = True
|
||||||
|
return opts
|
||||||
|
app = StaticFileApp()
|
||||||
|
with app.test_request_context():
|
||||||
|
rv = app.send_static_file('index.html')
|
||||||
|
cc = parse_cache_control_header(rv.headers['Cache-Control'])
|
||||||
|
self.assert_equal(cc.max_age, 10)
|
||||||
|
|
||||||
|
|
||||||
class LoggingTestCase(FlaskTestCase):
|
class LoggingTestCase(FlaskTestCase):
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue