forked from orbit-oss/flask
Added example on faking resources and context
This commit is contained in:
parent
0676bb8ab5
commit
1f6be7ff63
1 changed files with 48 additions and 0 deletions
|
|
@ -251,6 +251,53 @@ This in general is less useful because at that point you can directly
|
||||||
start using the test client.
|
start using the test client.
|
||||||
|
|
||||||
|
|
||||||
|
Faking Resources and Context
|
||||||
|
----------------------------
|
||||||
|
|
||||||
|
.. versionadded:: 0.10
|
||||||
|
|
||||||
|
A very common pattern is to store user authorization information and
|
||||||
|
database connections on the application context or the :attr:`flask.g`
|
||||||
|
object. The general pattern for this is to put the object on there on
|
||||||
|
first usage and then to remove it on a teardown. Imagine for instance
|
||||||
|
this code to get the current user::
|
||||||
|
|
||||||
|
def get_user():
|
||||||
|
user = getattr(g, 'user', None)
|
||||||
|
if user is None:
|
||||||
|
user = fetch_current_user_from_database()
|
||||||
|
g.user = user
|
||||||
|
return user
|
||||||
|
|
||||||
|
For a test it would be nice to override this user from the outside without
|
||||||
|
having to change some code. This can trivially be accomplished with
|
||||||
|
hooking the :data:`flask.appcontext_pushed` signal::
|
||||||
|
|
||||||
|
from contextlib import contextmanager
|
||||||
|
from flask import appcontext_pushed
|
||||||
|
|
||||||
|
@contextmanager
|
||||||
|
def user_set(app, user):
|
||||||
|
def handler(sender, **kwargs):
|
||||||
|
g.user = user
|
||||||
|
with appcontext_pushed.connected_to(handler, app):
|
||||||
|
yield
|
||||||
|
|
||||||
|
And then to use it::
|
||||||
|
|
||||||
|
from flask import json, jsonify
|
||||||
|
|
||||||
|
@app.route('/users/me')
|
||||||
|
def users_me():
|
||||||
|
return jsonify(username=g.user.username)
|
||||||
|
|
||||||
|
with user_set(app, my_user):
|
||||||
|
with app.test_client() as c:
|
||||||
|
resp = c.get('/users/me')
|
||||||
|
data = json.loads(resp.data)
|
||||||
|
self.assert_equal(data['username'], my_user.username)
|
||||||
|
|
||||||
|
|
||||||
Keeping the Context Around
|
Keeping the Context Around
|
||||||
--------------------------
|
--------------------------
|
||||||
|
|
||||||
|
|
@ -271,6 +318,7 @@ If you were to use just the :meth:`~flask.Flask.test_client` without
|
||||||
the `with` block, the `assert` would fail with an error because `request`
|
the `with` block, the `assert` would fail with an error because `request`
|
||||||
is no longer available (because you are trying to use it outside of the actual request).
|
is no longer available (because you are trying to use it outside of the actual request).
|
||||||
|
|
||||||
|
|
||||||
Accessing and Modifying Sessions
|
Accessing and Modifying Sessions
|
||||||
--------------------------------
|
--------------------------------
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue