Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with HTTPS or Subversion.

Download ZIP
Browse files

Implemented flask.has_request_context()

  • Loading branch information...
commit fbd488678f93c13527a9fba252bd89b53abec5e9 1 parent f58c989
@mitsuhiko authored
View
1  CHANGES
@@ -39,6 +39,7 @@ Release date to be announced, codename to be selected
- Implemented a silent flag for `config.from_pyfile`.
- Added `teardown_request` decorator, for functions that should run at the end
of a request regardless of whether an exception occurred.
+- Implemented :func:`flask.has_request_context`
Version 0.6.1
-------------
View
2  docs/api.rst
@@ -224,6 +224,8 @@ Useful Functions and Classes
This is a proxy. See :ref:`notes-on-proxies` for more information.
+.. autofunction:: has_request_context
+
.. autofunction:: url_for
.. function:: abort(code)
View
1  flask/__init__.py
@@ -21,6 +21,7 @@
send_file, send_from_directory, get_flashed_messages, \
get_template_attribute, make_response
from .globals import current_app, g, request, session, _request_ctx_stack
+from .ctx import has_request_context
from .module import Module
from .templating import render_template, render_template_string
from .session import Session
View
32 flask/ctx.py
@@ -19,6 +19,38 @@ class _RequestGlobals(object):
pass
+def has_request_context():
+ """If you have code that wants to test if a request context is there or
+ not this function can be used. For instance if you want to take advantage
+ of request information is it's available but fail silently if the request
+ object is unavailable.
+
+ ::
+
+ class User(db.Model):
+
+ def __init__(self, username, remote_addr=None):
+ self.username = username
+ if remote_addr is None and has_request_context():
+ remote_addr = request.remote_addr
+ self.remote_addr = remote_addr
+
+ Alternatively you can also just test any of the context bound objects
+ (such as :class:`request` or :class:`g` for truthness)::
+
+ class User(db.Model):
+
+ def __init__(self, username, remote_addr=None):
+ self.username = username
+ if remote_addr is None and request:
+ remote_addr = request.remote_addr
+ self.remote_addr = remote_addr
+
+ .. versionadded:: 0.7
+ """
+ return _request_ctx_stack.top is not None
+
+
class _RequestContext(object):
"""The request context contains all request relevant information. It is
created at the beginning of the request and pushed to the
View
12 tests/flask_tests.py
@@ -89,6 +89,18 @@ def meh():
assert meh() == 'http://localhost/meh'
assert flask._request_ctx_stack.top is None
+ def test_context_test(self):
+ app = flask.Flask(__name__)
+ assert not flask.request
+ assert not flask.has_request_context()
+ ctx = app.test_request_context()
+ ctx.push()
+ try:
+ assert flask.request
+ assert flask.has_request_context()
+ finally:
+ ctx.pop()
+
def test_manual_context_binding(self):
app = flask.Flask(__name__)
@app.route('/')
Please sign in to comment.
Something went wrong with that request. Please try again.