mirror of https://github.com/pallets/flask.git
wait until app ctx is ready before matching url
`RequestContext.match_request` is moved from `__init__` to `push`. This causes matching to happen later, when the app context is available. This enables URL converters that use things such as the database.
This commit is contained in:
parent
29111a3259
commit
1ff98a2d21
|
@ -314,9 +314,6 @@ class RequestContext(object):
|
||||||
# functions.
|
# functions.
|
||||||
self._after_request_functions = []
|
self._after_request_functions = []
|
||||||
|
|
||||||
if self.url_adapter is not None:
|
|
||||||
self.match_request()
|
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def g(self):
|
def g(self):
|
||||||
return _app_ctx_stack.top.g
|
return _app_ctx_stack.top.g
|
||||||
|
@ -384,6 +381,9 @@ class RequestContext(object):
|
||||||
|
|
||||||
_request_ctx_stack.push(self)
|
_request_ctx_stack.push(self)
|
||||||
|
|
||||||
|
if self.url_adapter is not None:
|
||||||
|
self.match_request()
|
||||||
|
|
||||||
# Open the session at the moment that the request context is available.
|
# Open the session at the moment that the request context is available.
|
||||||
# This allows a custom open_session method to use the request context.
|
# This allows a custom open_session method to use the request context.
|
||||||
# Only open a new session if this is the first time the request was
|
# Only open a new session if this is the first time the request was
|
||||||
|
|
|
@ -1384,26 +1384,6 @@ def test_url_for_passes_special_values_to_build_error_handler(app):
|
||||||
flask.url_for("/")
|
flask.url_for("/")
|
||||||
|
|
||||||
|
|
||||||
def test_custom_converters(app, client):
|
|
||||||
from werkzeug.routing import BaseConverter
|
|
||||||
|
|
||||||
class ListConverter(BaseConverter):
|
|
||||||
def to_python(self, value):
|
|
||||||
return value.split(",")
|
|
||||||
|
|
||||||
def to_url(self, value):
|
|
||||||
base_to_url = super(ListConverter, self).to_url
|
|
||||||
return ",".join(base_to_url(x) for x in value)
|
|
||||||
|
|
||||||
app.url_map.converters["list"] = ListConverter
|
|
||||||
|
|
||||||
@app.route("/<list:args>")
|
|
||||||
def index(args):
|
|
||||||
return "|".join(args)
|
|
||||||
|
|
||||||
assert client.get("/1,2,3").data == b"1|2|3"
|
|
||||||
|
|
||||||
|
|
||||||
def test_static_files(app, client):
|
def test_static_files(app, client):
|
||||||
rv = client.get("/static/index.html")
|
rv = client.get("/static/index.html")
|
||||||
assert rv.status_code == 200
|
assert rv.status_code == 200
|
||||||
|
|
|
@ -0,0 +1,38 @@
|
||||||
|
from flask.globals import _app_ctx_stack
|
||||||
|
|
||||||
|
|
||||||
|
def test_custom_converters(app, client):
|
||||||
|
from werkzeug.routing import BaseConverter
|
||||||
|
|
||||||
|
class ListConverter(BaseConverter):
|
||||||
|
def to_python(self, value):
|
||||||
|
return value.split(",")
|
||||||
|
|
||||||
|
def to_url(self, value):
|
||||||
|
base_to_url = super(ListConverter, self).to_url
|
||||||
|
return ",".join(base_to_url(x) for x in value)
|
||||||
|
|
||||||
|
app.url_map.converters["list"] = ListConverter
|
||||||
|
|
||||||
|
@app.route("/<list:args>")
|
||||||
|
def index(args):
|
||||||
|
return "|".join(args)
|
||||||
|
|
||||||
|
assert client.get("/1,2,3").data == b"1|2|3"
|
||||||
|
|
||||||
|
|
||||||
|
def test_model_converters(app, client):
|
||||||
|
from werkzeug.routing import BaseConverter
|
||||||
|
|
||||||
|
class ModelConverterTester(BaseConverter):
|
||||||
|
def to_python(self, value):
|
||||||
|
assert _app_ctx_stack.top is not None
|
||||||
|
return value
|
||||||
|
|
||||||
|
app.url_map.converters["model"] = ModelConverterTester
|
||||||
|
|
||||||
|
@app.route("/<model:user_name>")
|
||||||
|
def index(user_name):
|
||||||
|
return user_name, 200
|
||||||
|
|
||||||
|
client.get("/admin").data
|
|
@ -153,7 +153,6 @@ def test_blueprint_with_subdomain():
|
||||||
|
|
||||||
ctx = app.test_request_context("/", subdomain="xxx")
|
ctx = app.test_request_context("/", subdomain="xxx")
|
||||||
assert ctx.request.url == "http://xxx.example.com:1234/foo/"
|
assert ctx.request.url == "http://xxx.example.com:1234/foo/"
|
||||||
assert ctx.request.blueprint == bp.name
|
|
||||||
|
|
||||||
rv = client.get("/", subdomain="xxx")
|
rv = client.get("/", subdomain="xxx")
|
||||||
assert rv.data == b"http://xxx.example.com:1234/foo/"
|
assert rv.data == b"http://xxx.example.com:1234/foo/"
|
||||||
|
|
Loading…
Reference in New Issue