Exemple #1
0
def get_http_params(environ):        
    '''build _params (and maybe _postContent)'''
    import cgi

    _params = {}
    _postContent = None
    getparams = utils.defaultattrdict()
    postparams = utils.defaultattrdict()

    if environ.get('QUERY_STRING'):
        forms = cgi.FieldStorage(environ=environ, keep_blank_values=1)
        for key in forms.keys():
            valueList = forms[key]
            if isinstance(valueList, list):# Check if it's a list or not
                getparams[key]= [item.value for item in valueList]
            else:
                getparams[key] = valueList.value

    if environ['REQUEST_METHOD'] == 'POST':
        forms = cgi.FieldStorage(fp=environ.get('wsgi.input'),
                                environ=environ, keep_blank_values=1)
        if forms.list is None:
            assert forms.file is not None
            _postContent = forms.file.read()
        else:
            for key in forms.keys():
                valueList = forms[key]
                if isinstance(valueList, list):# Check if it's a list or not
                    postparams[key]= [item.value for item in valueList]
                else:
                    # In case it's a file being uploaded, we save the filename in a map (user might need it)
                    if not valueList.filename:
                        postparams[key] = valueList.value
                    else:
                        postparams[key] = UploadFile(valueList)

    if getparams and postparams:
        #merge the dicts together
        for k,v in getparams.items():
            if k in postparams:
                if not isinstance(v, list):
                    v = [v]
                pv = postparams[k]
                if isinstance(pv, list):
                    v.extend(pv)
                else:
                    v.append(pv)
            postparams[k] = v
        _params = postparams
    else:
        _params = getparams or postparams

    return dict(_params=_params, _postContent=_postContent)
Exemple #2
0
def servetemplate(kw, retval):
    from mako.exceptions import TopLevelLookupException
    
    path = kw._name
    db = kw.__server__.defaultStore
    if kw.urlvars:
        if 'path' in kw.urlvars:
            path = kw.urlvars.path
        if kw.urlvars.db:
            try:
                db = kw.__server__.stores[kw.urlvars.db]
            except KeyError:
                return retval #not found
        
    try: 
        template = kw.__server__.template_loader.get_template(path)
    except TopLevelLookupException:
        #couldn't find template
        return retval #not found
    if template:
        return template.render(params=kw._params, 
                        urlvars=kw.get('urlvars',{}), 
                        request=kw, 
                        config=kw.__server__.config,
                        server=kw.__server__,
                        __=defaultattrdict(), 
                        db=db)
    else:
        return retval
Exemple #3
0
    def loadConfig(self, appVars):
        if appVars.get('beforeConfigHook'):
            appVars['beforeConfigHook'](appVars)

        self.config = utils.defaultattrdict(appVars)

        def initConstants(varlist, default):
            #add the given list of config properties as attributes
            #on this RequestProcessor
            return assignAttrs(self, appVars, varlist, default)

        initConstants( [ 'actions'], {})
        initConstants( ['default_mime_type'], '')        
        self.initLock(appVars)
        self.txnSvc = transactions.ProcessorTransactionService(self)
        initConstants( [ 'stores', 'storeDefaults'], {})
        addNewResourceHook = self.actions.get('before-new')
        self.defaultStore = None
        if 'stores' in appVars:
            stores = utils.attrdict()
            for name, storeConfig in appVars['stores'].items():
                stores[name] = self.loadDataStore(storeConfig, 
                                    self.storeDefaults, addNewResourceHook)
                if storeConfig.get('default_store') or name == 'default':
                    self.defaultStore = stores[name]
            if stores and not self.defaultStore:
                if len(stores) > 1:
                    raise VesperError('default store not set')
                else:
                    self.defaultStore = stores.values()[0]
            #XXX in order to allow cmdline and config file storage settings to be useful
            #merge appVars into the default store's config before loadDataStore
            self.stores = stores
        else:
            self.defaultStore = self.loadDataStore(appVars,self.storeDefaults,addNewResourceHook)
            self.stores = utils.attrdict(default=self.defaultStore)

        #app_name is a unique name for this request processor instance
        initConstants( ['app_name'], 'root')
        self.log = logging.getLogger("app." + self.app_name)
                        
        self.defaultRequestTrigger = appVars.get('default_trigger','http-request')
        initConstants( ['global_request_vars', 'static_path', 'template_path'], [])
        self.work_dir = appVars.get('work_dir', 'vesper_work')
        self.mako_module_dir = appVars.get('mako_module_dir', os.path.join(self.work_dir,'mako_modules'))
        initConstants( ['template_options'], {})        
        self.global_request_vars.extend( self.defaultGlobalVars )
        self.default_page_name = appVars.get('default_page_name', 'index')
        #cache settings:
        initConstants( ['secure_file_access', 'use_etags'], True)
        self.default_expires_in = appVars.get('default_expires_in', 0)
        initConstants( ['action_cache_size'], 0)
        self.validate_external_request = appVars.get('validate_external_request',
                                        lambda *args: True)
        self.get_principal_func = appVars.get('get_principal_func', lambda kw: '')        
        self.argsForConfig = appVars.get('argsForConfig', [])
        
        if appVars.get('configHook'):
            appVars['configHook'](appVars)
Exemple #4
0
    def handleCommandLine(self, argv):
        '''  the command line is translated into the `_params`
        request variable as follows:

        * arguments beginning with a '-' are treated as a variable
        name with its value being the next argument unless that
        argument also starts with a '-'

        * the entire command line is assigned to the variable 'cmdline'
        '''
        kw = utils.attrdict()
        kw._params = utils.defaultattrdict(argsToKw(argv))
        kw['cmdline'] = '"' + '" "'.join(argv) + '"'
        self.runActions('run-cmds', kw)
Exemple #5
0
def gensequence(kw, default=None):
    "Yields an Action.  This is a generator purely due to requirements in the Action code"
    global _routemap_dirty    
    if _routemap_dirty:
        # print "generating routemap"
        route_map.create_regs()
        _routemap_dirty = False
    
    request_url = kw['_name']
    r = route_map.match(request_url, kw.get('_environ'))
    if r:
        kw['urlvars'] = defaultattrdict(r) # XXX should probably strip 'action' & 'controller'
        yield r['controller']
    elif default:
        yield default