예제 #1
0
    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)
예제 #2
0
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()
예제 #3
0
    def __call__(self, environ, start_response):

        handle_i18n(environ)
        return self.app(environ, start_response)