diff --git a/CHANGES b/CHANGES index b19db94c..d646383e 100644 --- a/CHANGES +++ b/CHANGES @@ -35,6 +35,9 @@ Version 0.10.2 - Fixed an etags bug when sending a file streams with a name. - Fixed `send_from_directory` not expanding to the application root path correctly. +- Changed logic of before first request handlers to flip the flag after + invoking. This will allow some uses that are potentially dangerous but + should probably be permitted. Version 0.10.1 -------------- diff --git a/flask/app.py b/flask/app.py index 95d57ed8..0317075a 100644 --- a/flask/app.py +++ b/flask/app.py @@ -1491,9 +1491,9 @@ class Flask(_PackageBoundObject): with self._before_request_lock: if self._got_first_request: return - self._got_first_request = True for func in self.before_first_request_funcs: func() + self._got_first_request = True def make_default_options_response(self): """This method is called to create the default `OPTIONS` response. diff --git a/flask/testsuite/basic.py b/flask/testsuite/basic.py index bbbdf5e0..4bbef40d 100644 --- a/flask/testsuite/basic.py +++ b/flask/testsuite/basic.py @@ -15,7 +15,7 @@ import flask import pickle import unittest from datetime import datetime -from threading import Thread +from threading import Thread, Condition from flask.testsuite import FlaskTestCase, emits_module_deprecation_warning from flask._compat import text_type from werkzeug.exceptions import BadRequest, NotFound @@ -1095,6 +1095,27 @@ class BasicFunctionalityTestCase(FlaskTestCase): self.assert_equal(got, [42]) self.assert_true(app.got_first_request) + def test_before_first_request_functions_concurrent(self): + got = [] + app = flask.Flask(__name__) + cv = Condition() + @app.before_first_request + def foo(): + with cv: + cv.wait() + got.append(42) + c = app.test_client() + def get_and_assert(): + with cv: + cv.notify() + c.get("/") + self.assert_equal(got, [42]) + t = Thread(target=get_and_assert) + t.start() + get_and_assert() + t.join() + self.assert_true(app.got_first_request) + def test_routing_redirect_debugging(self): app = flask.Flask(__name__) app.debug = True