import os
import logging
+from contextlib import contextmanager
from mediagoblin.routing import get_url_map
from mediagoblin.tools.routing import endpoint_to_controller
self.meddleware = [common.import_component(m)(self)
for m in meddleware.ENABLED_MEDDLEWARE]
+ @contextmanager
def gen_context(self, ctx=None):
"""
Attach contextual information to request, or generate a context object
information (current translation, etc) are attached to this
object.
"""
+ if DISABLE_GLOBALS:
+ with self.db_manager.session_scope() as db:
+ yield self._gen_context(db, ctx)
+ else:
+ yield self._gen_context(self.db, ctx)
+
+ def _gen_context(self, db, ctx):
# Set up context
# --------------
# Also attach a few utilities from request.app for convenience?
ctx.app = self
- if not DISABLE_GLOBALS:
- ctx.db = self.db
+ ctx.db = db
ctx.staticdirect = self.staticdirector
environ.pop('HTTPS')
## Attach utilities to the request object
- request = self.gen_context(request)
+ with self.gen_context(request) as request:
+ return self._finish_call_backend(request, environ, start_response)
+ def _finish_call_backend(self, request, environ, start_response):
# Log user out if authentication_disabled
no_auth_logout(request)
# get the Http response from the controller
try:
- if DISABLE_GLOBALS:
- with self.db_manager.session_scope() as request.db:
- response = controller(request)
- else:
- response = controller(request)
+ response = controller(request)
except HTTPException as e:
response = render_http_exception(
request, e, e.get_description(environ))
"----------------------\n"
"Available vars:\n"
" - app: instantiated mediagoblin application\n"
- " - db: database session\n")
+ " - db: database session\n"
+ " - ctx: context object\n")
else:
SHELL_BANNER = (
"GNU MediaGoblin shell!\n"
"Available vars:\n"
" - app: instantiated mediagoblin application\n"
" - mg_globals: mediagoblin.globals\n"
- " - db: database instance\n")
+ " - db: database instance\n"
+ " - ctx: context object\n")
def py_shell(**user_namespace):
"""
"""
app = commands_util.setup_app(args)
- def run_shell(db):
+ def run_shell(db, ctx):
user_namespace = {
'mg_globals': mg_globals,
'app': app,
- 'db': db}
+ 'db': db,
+ "ctx": ctx}
if args.ipython:
ipython_shell(**user_namespace)
if not ipython_shell(**user_namespace):
py_shell(**user_namespace)
- if DISABLE_GLOBALS:
- with app.db_manager.session_scope() as db:
- run_shell(db)
- else:
- run_shell(mg_globals.database)
+ with app.gen_context() as ctx:
+ db = ctx.db
+ run_shell(db, ctx)