def __call__(self, c=None, f='index', args=[], vars={}, extension=None, target=None,ajax=False,ajax_trap=False, url=None): import globals target = target or 'c'+str(random.random())[2:] request = self.environment['request'] if '.' in f: f, extension = f.split('.',1) if c and not url and not ajax: other_environment = copy.copy(self.environment) other_request = globals.Request() other_request.application = request.application other_request.controller = c other_request.function = f other_request.extension = extension or request.extension other_request.args = List(args) other_request.folder = request.folder other_request.env = request.env if not ajax_trap: other_request.vars = request.vars other_request.get_vars = request.get_vars other_request.post_vars = request.post_vars else: other_request.vars = vars other_environment['request'] = other_request other_response = globals.Response() other_environment['response'] = other_response other_response._view_environment = other_environment other_request.env.http_web2py_component_location = \ request.env.path_info other_request.env.http_web2py_component_element = target other_response.view = '%s/%s.%s' % (c,f, other_request.extension) page = run_controller_in(c, f, other_environment) if isinstance(page, dict): other_response._vars = page for key in page: other_response._view_environment[key] = page[key] run_view_in(other_response._view_environment) page = other_response.body.getvalue() script = '' if ajax_trap: script += "web2py_trap_form('%s','%s');" % \ (html.URL(request.application,c,f, args=args,vars=vars, extension=extension),target) #for (name,value) in other_response.headers: # if name == 'web2py-component-command': # script += value return html.TAG[''](html.DIV(html.XML(page),_id=target), html.SCRIPT(script,_type="text/javascript")) else: url = url or html.URL(request.application,c, f, args=args,vars=vars, extension=extension) return html.TAG[''](html.SCRIPT('web2py_component("%s","%s")' % \ (url,target), _type="text/javascript"), html.DIV('loading...',_id=target))
def __call__(self, c=None, f='index', args=None, vars=None, extension=None, target=None,ajax=False,ajax_trap=False, url=None,user_signature=False, content='loading...',**attr): if args is None: args = [] vars = Storage(vars or {}) import globals target = target or 'c'+str(random.random())[2:] attr['_id']=target request = self.environment['request'] if '.' in f: f, extension = f.rsplit('.',1) if url or ajax: url = url or html.URL(request.application, c, f, r=request, args=args, vars=vars, extension=extension, user_signature=user_signature) script = html.SCRIPT('web2py_component("%s","%s")' % (url, target), _type="text/javascript") return html.TAG[''](script, html.DIV(content,**attr)) else: if not isinstance(args,(list,tuple)): args = [args] c = c or request.controller other_request = Storage(request) other_request['env'] = Storage(request.env) other_request.controller = c other_request.function = f other_request.extension = extension or request.extension other_request.args = List(args) other_request.vars = vars other_request.get_vars = vars other_request.post_vars = Storage() other_response = globals.Response() other_request.env.path_info = '/' + \ '/'.join([request.application,c,f] + \ map(str, other_request.args)) other_request.env.query_string = \ vars and html.URL(vars=vars).split('?')[1] or '' other_request.env.http_web2py_component_location = \ request.env.path_info other_request.cid = target other_request.env.http_web2py_component_element = target other_response.view = '%s/%s.%s' % (c,f, other_request.extension) other_environment = copy.copy(self.environment) other_response._view_environment = other_environment other_response.generic_patterns = \ copy.copy(current.response.generic_patterns) other_environment['request'] = other_request other_environment['response'] = other_response ## some magic here because current are thread-locals original_request, current.request = current.request, other_request original_response, current.response = current.response, other_response page = run_controller_in(c, f, other_environment) if isinstance(page, dict): other_response._vars = page other_response._view_environment.update(page) run_view_in(other_response._view_environment) page = other_response.body.getvalue() current.request, current.response = original_request, original_response js = None if ajax_trap: link = html.URL(request.application, c, f, r=request, args=args, vars=vars, extension=extension, user_signature=user_signature) js = "web2py_trap_form('%s','%s');" % (link, target) script = js and html.SCRIPT(js,_type="text/javascript") or '' return html.TAG[''](html.DIV(html.XML(page),**attr),script)
def __call__(self, c=None, f='index', args=[], vars={}, extension=None, target=None,ajax=False,ajax_trap=False, url=None,user_signature=False, content='loading...',**attr): import globals target = target or 'c'+str(random.random())[2:] attr['_id']=target request = self.environment['request'] if '.' in f: f, extension = f.split('.',1) if url or ajax: url = url or html.URL(request.application, c, f, r=request, args=args, vars=vars, extension=extension, user_signature=user_signature) script = html.SCRIPT('web2py_component("%s","%s")' % (url, target), _type="text/javascript") return html.TAG[''](script, html.DIV(content,**attr)) else: if not isinstance(args,(list,tuple)): args = [args] c = c or request.controller other_request = globals.Request() other_request.application = request.application other_request.controller = c other_request.function = f other_request.extension = extension or request.extension other_request.args = List(args) other_request.folder = request.folder other_request.env = request.env other_request.vars = request.vars other_request.get_vars = request.get_vars other_request.post_vars = request.post_vars other_response = globals.Response() other_request.env.http_web2py_component_location = \ request.env.path_info other_request.env.http_web2py_component_element = target other_response.view = '%s/%s.%s' % (c,f, other_request.extension) other_environment = copy.copy(self.environment) other_response._view_environment = other_environment other_environment['request'] = other_request other_environment['response'] = other_response page = run_controller_in(c, f, other_environment) if isinstance(page, dict): other_response._vars = page for key in page: other_response._view_environment[key] = page[key] run_view_in(other_response._view_environment) page = other_response.body.getvalue() js = None if ajax_trap: link = html.URL(request.application, c, f, r=request, args=args, vars=vars, extension=extension, user_signature=user_signature) js = "web2py_trap_form('%s','%s');" % (link, target) # not sure about this # for (name,value) in other_response.headers: # if name == 'web2py-component-command': # js += value script = js and html.SCRIPT(js,_type="text/javascript") or '' return html.TAG[''](html.DIV(html.XML(page),**attr),script)
def wsgibase(environ, responder): """ this is the gluon wsgi application. the furst function called when a page is requested (static or dynamical). it can be called by paste.httpserver or by apache mod_wsgi. """ request = Request() response = Response() session = Session() try: try: session_file = None session_new = False # ################################################## # parse the environment variables - DONE # ################################################## for (key, value) in environ.items(): request.env[key.lower().replace('.', '_')] = value request.env.web2py_path = web2py_path request.env.web2py_version = web2py_version # ################################################## # valudate the path in url # ################################################## if not request.env.path_info and request.env.request_uri: # for fcgi, decode path_info and query_string items = request.env.request_uri.split('?') request.env.path_info = items[0] if len(items) > 1: request.env.query_string = items[1] else: request.env.query_string = '' path = request.env.path_info[1:].replace('\\', '/') path = regex_space.sub('_', path) if not regex_url.match(path): raise HTTP(400, error_message, web2py_error='invalid path') items = path.split('/') # ################################################## # serve if a static file # ################################################## if len(items) > 1 and items[1] == 'static': if len(items) < 3 or not items[2]: raise HTTP(400, error_message) static_file = os.path.join(request.env.web2py_path, 'applications', items[0], 'static', '/'.join(items[2:])) response.stream(static_file, request=request) # ################################################## # parse application, controller and function # ################################################## if len(items) and items[-1] == '': del items[-1] if len(items) == 0: items = ['init'] if len(items) == 1: items.append('default') if len(items) == 2: items.append('index') if len(items) > 3: (items, request.args) = (items[:3], items[3:]) if request.args == None: request.args = [] request.application = items[0] request.controller = items[1] request.function = items[2] request.client = get_client(request.env) request.folder = os.path.join(request.env.web2py_path, 'applications', request.application) + '/' # ################################################## # access the requested application # ################################################## if not os.path.exists(request.folder): if items == ['init', 'default', 'index']: items[0] = 'welcome' redirect(html.URL(*items)) raise HTTP(400, error_message, web2py_error='invalid application') # ################################################## # get the GET and POST data -DONE # ################################################## request.body = tempfile.TemporaryFile() if request.env.content_length: copystream(request.env.wsgi_input, request.body, int(request.env.content_length)) # ## parse GET vars, even if POST dget = cgi.parse_qsl(request.env.query_string, keep_blank_values=1) for (key, value) in dget: if request.vars.has_key(key): if isinstance(request.vars[key], list): request.vars[key].append(value) else: request.vars[key] = [request.vars[key], value] else: request.vars[key] = value request.get_vars[key] = request.vars[key] # ## parse POST vars if any if request.env.request_method in ['POST', 'BOTH']: dpost = cgi.FieldStorage(fp=request.body, environ=environ, keep_blank_values=1) request.body.seek(0) try: keys = dpost.keys() except TypeError: keys = [] for key in keys: dpk = dpost[key] if isinstance(dpk, list): value = [x.value for x in dpk] elif not dpk.filename: value = dpk.value else: value = dpk request.post_vars[key] = request.vars[key] = value # ################################################## # load cookies # ################################################## request.cookies = Cookie.SimpleCookie() response.cookies = Cookie.SimpleCookie() if request.env.http_cookie: request.cookies.load(request.env.http_cookie) # ################################################## # try load session or create new session file # ################################################## session.connect(request, response) # ################################################## # set no-cache headers # ################################################## response.headers['Cache-Control'] = \ 'no-store, no-cache, must-revalidate, post-check=0, pre-check=0' response.headers['Expires'] = \ time.strftime('%a, %d %b %Y %H:%M:%S GMT', time.gmtime()) response.headers['Pragma'] = 'no-cache' # ################################################## # run controller # ################################################## if not items[1] == 'static': serve_controller(request, response, session) except HTTP, http_response: # ################################################## # on sucess, try store session in database # ################################################## session._try_store_in_db(request, response) # ################################################## # on sucess, committ database # ################################################## if response._custom_commit: response._custom_commit() else: SQLDB.close_all_instances(SQLDB.commit) # ################################################## # if session not in db try store session on filesystem # ################################################## session._try_store_on_disk(request, response) # ################################################## # store cookies in headers # ################################################## if session._secure: response.cookies[response.session_id_name]['secure'] = \ True http_response.headers['Set-Cookie'] = [ str(cookie)[11:] for cookie in response.cookies.values() ] # ################################################## # whatever happens return the intended HTTP response # ################################################## session._unlock(response) return http_response.to(responder) except RestrictedError, e: # ################################################## # on application error, rollback database # ################################################## if response._custom_rollback: response._custom_rollback() else: SQLDB.close_all_instances(SQLDB.rollback) try: ticket = e.log(request) except: ticket = 'unknown' logging.error(e.traceback) session._unlock(response) http_error_status = check_error_route(500, items[0]) return HTTP(http_error_status, error_message_ticket % dict(ticket=ticket), web2py_error='ticket %s' % ticket).to(responder)