Esempio n. 1
0
def make_application(debug=None, apps_dir='apps', project_dir=None, include_apps=None, debug_console=True, settings_file='settings.ini', start=True):
    from uliweb.utils.common import sort_list
    
    if project_dir:
        apps_dir = os.path.normpath(os.path.join(project_dir, 'apps'))
        
    if apps_dir not in sys.path:
        sys.path.insert(0, apps_dir)
        
    install_config(apps_dir)
    
    application = app = SimpleFrame.Dispatcher(apps_dir=apps_dir, include_apps=include_apps, settings_file=settings_file, start=start)
    
    #settings global application object
    uliweb.application = app
    
    if uliweb.settings.GLOBAL.WSGI_MIDDLEWARES:
        s = sort_list(uliweb.settings.GLOBAL.WSGI_MIDDLEWARES, default=500)
        for w in reversed(s):
            if w in uliweb.settings:
                args = uliweb.settings[w].dict()
            else:
                args = None
            if args:
                klass = args.pop('CLASS', None) or args.pop('class', None)
                if not klass:
                    logging.error('Error: There is no a CLASS option in this WSGI Middleware [%s].' % w)
                    continue
                modname, clsname = klass.rsplit('.', 1)
                try:
                    mod = __import__(modname, {}, {}, [''])
                    c = getattr(mod, clsname)
                    app = c(app, **args)
                except Exception, e:
                    log.exception(e)
Esempio n. 2
0
    def __call__(self, environ, start_response):
        local.application = self
        local.request = req = Request(environ)
        conf.request = RequestProxy()
        local.response = res = Response(content_type='text/html')
        conf.response = ResponseProxy()
        local.url_adapter = adapter = conf.url_map.bind_to_environ(environ)
        
        try:
            endpoint, values = adapter.match()
            
            mod, handler_cls, handler = self.prepare_request(req, endpoint)
            
            #process static
            if endpoint in conf.static_views:
                response = self.call_view(mod, handler_cls, handler, req, res, kwargs=values)
            else:
                response = None
                _clses = {}
                _inss = {}

                #middleware process request
                middlewares = conf.settings.GLOBAL.get('MIDDLEWARE_CLASSES', [])
                s = []
                for middleware in middlewares:
                    try:
                        order = None
                        if isinstance(middleware, tuple):
                            order, middleware = middleware
                        cls = import_attr(middleware)
                        if order is None:
                            order = getattr(cls, 'ORDER', 500)
                        s.append((order, middleware))
                    except ImportError, e:
                        log.exception(e)
                        error("Can't import the middleware %s" % middleware)
                    _clses[middleware] = cls
                middlewares = sort_list(s)
                
                for middleware in middlewares:
                    cls = _clses[middleware]
                    if hasattr(cls, 'process_request'):
                        ins = cls(self, conf.settings)
                        _inss[middleware] = ins
                        response = ins.process_request(req)
                        if response is not None:
                            break
                
                if response is None:
                    try:
                        response = self.call_view(mod, handler_cls, handler, req, res, kwargs=values)
                        
                    except Exception, e:
                        for middleware in reversed(middlewares):
                            cls = _clses[middleware]
                            if hasattr(cls, 'process_exception'):
                                ins = _inss.get(middleware)
                                if not ins:
                                    ins = cls(self, conf.settings)
                                response = ins.process_exception(req, e)
                                if response:
                                    break
                        raise
                        
                else: