Example #1
0
 def _create_api(self, opts, args):
     """Create an API, as requested by the command."""
     options = {}
     options['documentroot'] = opts.docroot
     options['configfile'] = opts.cfgfile
     options['logfile'] = opts.logfile
     options = init_options(options)
     init_logger(options)
     init_codecs(options)
     api = API()
     if 'options' in self.require_api:
         api.options = options
     if 'logger' in self.require_api:
         api.logger = logging.getLogger('draco2.site')
     if 'config' in self.require_api:
         api.config = Config._create(api)
     if 'loader' in self.require_api:
         api.loader = Loader._create(api)
     if 'events' in self.require_api:
         api.events = EventManager._create(api)
     if 'database' in self.require_api:
         api.database = DatabaseManager._create(api)
         if opts.dsn:
             api.database._set_dsn(dsn)
     if 'models' in self.require_api:
         api.models = ModelManager._create(api)
     return api
Example #2
0
def handle_request(iface):
    """Handle a request."""
    # Acquire the read-write lock. This lock is held by all threads in
    # read mode when serving a Draco request. If one of the global Draco
    # objects needs to be reloaded, the lock is upgraded to write mode
    # by the thread that detected the reload condition. All threads will
    # then serialize and the reload can continue.
    rwlock.acquire_read()
    try:
        # Once off initialization. No user code can be run from this, and
        # there's no option of recording errors.
        initlock.acquire()
        try:
            global initialized, options
            if not initialized:
                options = init_options(iface.options())
                init_logger(options)
                init_codecs(options)
                initialized = True
        finally:
            initlock.release()

        # Dispatch the request. Errors are handled from now on.
        debug = options.get('debug')
        profile = options.get('profile')
        logger = logging.getLogger('draco2.core.dispatch')
        try:
            agent = iface.headers_in().get('user-agent', [''])[0]
            logger.debug('Request: %s (%s)' % (iface.uri(), agent))
            t1 = time.time()
            if profile:
                import lsprof
                stats = lsprof.profile(dispatch_request, iface)
                stats.sort('inlinetime')
                io = StringIO()
                stats.pprint(top=20, file=io)
                logger.debug(io.getvalue())
                stats.sort('totaltime')
                io = StringIO()
                stats.pprint(top=20, file=io)
                logger.debug(io.getvalue())
            else:
                dispatch_request(iface)
            t2 = time.time()
            logger.debug('Total time spent: %.2f (%s)' % ((t2 - t1), iface.uri()))
            return

        except HTTPResponse, exc:
            status = exc.status
            headers = exc.headers
            message = http.http_reason_strings[status]
            if not hasattr(exc, 'backtrace') or not exc.backtrace:
                exc.backtrace = get_backtrace()
            errorname = 'error_response_%03d' % status
            exception = exc

        except (StandardError, DracoError), exc:
            status = http.HTTP_INTERNAL_SERVER_ERROR
            headers = {}
            if not hasattr(exc, 'backtrace') or not exc.backtrace:
                exc.backtrace = get_backtrace()
            if debug:
                message = exc.backtrace
            else:
                message = http.http_reason_strings[status]
            errorname = 'uncaught_exception'
            exception = exc
            logger.error('A uncaught exception occurred. Backtrace follows.')
            logger.error(exc.backtrace)