Flask Application Context

Posted on with tags: flask

The push method of RequestContext class has those two lines of code (Lines 373 and 374 of ctx.py module in Flask 1.1.2) listed below. It pushes the application context variable app_ctx when a request context is pushed.

app_ctx = self.app.app_context()
app_ctx.push()

The app_context method of Flask class is defined on Line 2324 in app.py file. The method is really simple and the code is shown below. It initializes an AppContext object and returns it.

def app_context(self):
    return AppContext(self)

The AppContext class is however defined on Line 205 of ctx.py file. The code in __init__ method of AppContext class is shown below.

class AppContext(object):
    def __init__(self, app):
        self.app = app
        self.url_adapter = app.create_url_adapter(None)
        self.g = app.app_ctx_globals_class()

        # Like request context, app contexts can be pushed multiple times
        # but there a basic "refcount" is enough to track them.
        self._refcnt = 0
    ......

The AppContext class defines 4 instance variables self.app, self.url_adapter, self.g, and self._refcnt. The interesting variable is self.g, which is an instance of _AppCtxGlobals class defined on Line 28 of ctx.py file. Because it is a class object, you can set any attribute on the object like this.

g.user = User(...)

The push and pop methods of AppContext class is simpler than methods in RequestContext class. It pushes or pops the object on the _app_ctx_stack global variable defined in globals.py.

I will discuss the self.url_adapter in a later article.