def __call__(self, environ, start_response): '''Determine which app to call by asking each app if it can handle the url and method defined on the eviron''' # Process locale part on the incoming request URL so it doesn't affect # the mapper queries handle_i18n(environ) app_name = 'pylons_app' # currently defaulting to pylons app answers = self.ask_around(environ) available_handlers = [] for answer in answers: if len(answer) == 2: can_handle, asked_app = answer origin = 'core' else: can_handle, asked_app, origin = answer if can_handle: available_handlers.append('{0}_{1}'.format(asked_app, origin)) # Enforce order of precedence: # Flask Extension > Pylons Extension > Flask Core > Pylons Core if available_handlers: if 'flask_app_extension' in available_handlers: app_name = 'flask_app' elif 'pylons_app_extension' in available_handlers: app_name = 'pylons_app' elif 'flask_app_core' in available_handlers: app_name = 'flask_app' log.debug('Serving request via {0} app'.format(app_name)) environ['ckan.app'] = app_name if app_name == 'flask_app': # This request will be served by Flask, but we still need the # Pylons URL builder (Routes) to work parts = urlparse(config.get('ckan.site_url', 'http://0.0.0.0:5000')) request_config = routes_request_config() request_config.host = str(parts.netloc + parts.path) request_config.protocol = str(parts.scheme) request_config.mapper = config['routes.map'] return self.apps[app_name](environ, start_response) else: # Although this request will be served by Pylons we still # need an application context in order for the Flask URL # builder to work and to be able to access the Flask config flask_app = self.apps['flask_app']._wsgi_app with flask_app.test_request_context(): return self.apps[app_name](environ, start_response)
def ckan_before_request(): u'''Common handler executed before all Flask requests''' # Handle locale in URL handle_i18n() # Update app_globals app_globals.app_globals._check_uptodate() # Identify the user from the repoze cookie or the API header # Sets g.user and g.userobj identify_user() # Provide g.controller and g.action for backward compatibility # with extensions set_controller_and_action() g.__timer = time.time()
def __call__(self, environ, start_response): handle_i18n(environ) return self.app(environ, start_response)