Added pillar.flask_extra.vary_xhr() decorator
This produces a 'Vary: X-Requested-With' header on the response of decorated view functions, which indicates to the browser (or intermediate proxy servers) that the response may/will will be different for XHR and non-XHR requests.
This commit is contained in:
parent
736686390f
commit
203c6418fd
29
pillar/flask_extra.py
Normal file
29
pillar/flask_extra.py
Normal file
@ -0,0 +1,29 @@
|
||||
import functools
|
||||
import flask
|
||||
|
||||
|
||||
def add_response_headers(headers: dict):
|
||||
"""This decorator adds the headers passed in to the response"""
|
||||
|
||||
def decorator(f):
|
||||
@functools.wraps(f)
|
||||
def decorated_function(*args, **kwargs):
|
||||
resp = flask.make_response(f(*args, **kwargs))
|
||||
h = resp.headers
|
||||
for header, value in headers.items():
|
||||
h[header] = value
|
||||
return resp
|
||||
|
||||
return decorated_function
|
||||
|
||||
return decorator
|
||||
|
||||
|
||||
def vary_xhr():
|
||||
"""View function decorator; adds HTTP header "Vary: X-Requested-With" to the response"""
|
||||
|
||||
def decorator(f):
|
||||
header_adder = add_response_headers({'Vary': 'X-Requested-With'})
|
||||
return header_adder(f)
|
||||
|
||||
return decorator
|
35
tests/test_flask_extra.py
Normal file
35
tests/test_flask_extra.py
Normal file
@ -0,0 +1,35 @@
|
||||
import unittest
|
||||
|
||||
import flask
|
||||
|
||||
|
||||
class FlaskExtraTest(unittest.TestCase):
|
||||
def test_vary_xhr(self):
|
||||
import pillar.flask_extra
|
||||
|
||||
class TestApp(flask.Flask):
|
||||
def __init__(self, *args, **kwargs):
|
||||
super().__init__(*args, **kwargs)
|
||||
|
||||
self.add_url_rule('/must-vary', 'must-vary', self.must_vary)
|
||||
self.add_url_rule('/no-vary', 'no-vary', self.no_vary)
|
||||
|
||||
@pillar.flask_extra.vary_xhr()
|
||||
def must_vary(self):
|
||||
return 'yay'
|
||||
|
||||
def no_vary(self):
|
||||
return 'nah', 201
|
||||
|
||||
app = TestApp(__name__)
|
||||
client = app.test_client()
|
||||
|
||||
resp = client.get('/must-vary')
|
||||
self.assertEqual(200, resp.status_code)
|
||||
self.assertEqual('X-Requested-With', resp.headers['Vary'])
|
||||
self.assertEqual('yay', resp.data.decode())
|
||||
|
||||
resp = client.get('/no-vary')
|
||||
self.assertEqual(201, resp.status_code)
|
||||
self.assertNotIn('Vary', resp.headers)
|
||||
self.assertEqual('nah', resp.data.decode())
|
Loading…
x
Reference in New Issue
Block a user