Implement dict-like API on request objects for custom data. (#1666)
* Implement dict-like API on request objects for custom data. * Updated docs about custom_context.
This commit is contained in:
@@ -8,22 +8,72 @@ try:
|
||||
except ImportError:
|
||||
from json import loads
|
||||
|
||||
|
||||
def test_storage(app):
|
||||
def test_custom_context(app):
|
||||
@app.middleware("request")
|
||||
def store(request):
|
||||
request.ctx.user = "sanic"
|
||||
request.ctx.session = None
|
||||
|
||||
@app.route("/")
|
||||
def handler(request):
|
||||
# Accessing non-existant key should fail with AttributeError
|
||||
try:
|
||||
invalid = request.ctx.missing
|
||||
except AttributeError as e:
|
||||
invalid = str(e)
|
||||
return json({
|
||||
"user": request.ctx.user,
|
||||
"session": request.ctx.session,
|
||||
"has_user": hasattr(request.ctx, "user"),
|
||||
"has_session": hasattr(request.ctx, "session"),
|
||||
"has_missing": hasattr(request.ctx, "missing"),
|
||||
"invalid": invalid
|
||||
})
|
||||
|
||||
request, response = app.test_client.get("/")
|
||||
assert response.json == {
|
||||
"user": "sanic",
|
||||
"session": None,
|
||||
"has_user": True,
|
||||
"has_session": True,
|
||||
"has_missing": False,
|
||||
"invalid": "'types.SimpleNamespace' object has no attribute 'missing'",
|
||||
}
|
||||
|
||||
|
||||
# Remove this once the deprecated API is abolished.
|
||||
def test_custom_context_old(app):
|
||||
@app.middleware("request")
|
||||
def store(request):
|
||||
try:
|
||||
request["foo"]
|
||||
except KeyError:
|
||||
pass
|
||||
request["user"] = "sanic"
|
||||
request["sidekick"] = "tails"
|
||||
sidekick = request.get("sidekick", "tails") # Item missing -> default
|
||||
request["sidekick"] = sidekick
|
||||
request["bar"] = request["sidekick"]
|
||||
del request["sidekick"]
|
||||
|
||||
@app.route("/")
|
||||
def handler(request):
|
||||
return json(
|
||||
{"user": request.get("user"), "sidekick": request.get("sidekick")}
|
||||
{
|
||||
"user": request.get("user"),
|
||||
"sidekick": request.get("sidekick"),
|
||||
"has_bar": "bar" in request,
|
||||
"has_sidekick": "sidekick" in request,
|
||||
}
|
||||
)
|
||||
|
||||
request, response = app.test_client.get("/")
|
||||
|
||||
assert response.json == {
|
||||
"user": "sanic",
|
||||
"sidekick": None,
|
||||
"has_bar": True,
|
||||
"has_sidekick": False,
|
||||
}
|
||||
response_json = loads(response.text)
|
||||
assert response_json["user"] == "sanic"
|
||||
assert response_json.get("sidekick") is None
|
||||
|
||||
Reference in New Issue
Block a user