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)
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
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)
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)
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