def __iter__(self): path = self.environ.get('PATH_INFO', '/') tree = maybe_async(safe_async(self.page_tree)) while is_async(tree): yield b'' tree = maybe_async(tree) if is_failure(tree): request = self.bad_request(tree, route=path) else: try: node = tree.resolve(path) except Exception as e: request = self.bad_request(as_failure(e), tree=tree) else: request = maybe_async( safe_async(make_request, (self.environ, node))) while is_async(request): yield b'' request = maybe_async(request) if is_failure(request): request = self.bad_request(request, node=node) for processor in self.site.request_processors: try: processor(request) except: pass for response in self.response(request): if response is not None: break yield b'' for c in self.start(response): yield c
def __iter__(self): path = self.environ.get('PATH_INFO','/') tree = maybe_async(safe_async(self.page_tree)) while is_async(tree): yield b'' tree = maybe_async(tree) if is_failure(tree): request = self.bad_request(tree, route=path) else: try: node = tree.resolve(path) except Exception as e: request = self.bad_request(as_failure(e), tree=tree) else: request = maybe_async(safe_async(make_request, (self.environ, node))) while is_async(request): yield b'' request = maybe_async(request) if is_failure(request): request = self.bad_request(request, node=node) for processor in self.site.request_processors: try: processor(request) except: pass for response in self.response(request): if response is not None: break yield b'' for c in self.start(response): yield c
def submit_form(request, force_redirect=None, **kw): '''Comprehensive save method for forms. This method try to deal with all possible events occurring after a form has been submitted, including possible asynchronous behaviour.''' view = request.view if force_redirect is None: force_redirect = view.force_redirect fhtml = view.get_form(request, **kw) f = fhtml.form data = f.rawdata # The form has been aborted if forms.CANCEL_KEY in data: url = get_redirect(request, data, f.instance) raise HttpRedirect(url) # Save as new if forms.SAVE_AS_NEW_KEY in data and f.instance and f.instance.id: f.instance = view.mapper.save_as_new(f.instance, commit=False) # The form is valid. Invoke the submit_form method in the view if f.is_valid(): editing = bool(f.instance and f.instance.id) response = view.submit_form(request, f) if is_async(response): return response.add_callback(partial(_finish, request, editing, fhtml, force_redirect)) else: return _finish(request, editing, fhtml, force_redirect, response) else: if request.is_xhr: return fhtml.maker.json_messages(f) else: return view.get_response(request)
def submit_form(request, force_redirect=None, **kw): '''Comprehensive save method for forms. This method try to deal with all possible events occurring after a form has been submitted, including possible asynchronous behaviour.''' view = request.view if force_redirect is None: force_redirect = view.force_redirect fhtml = view.get_form(request, **kw) f = fhtml.form data = f.rawdata # The form has been aborted if forms.CANCEL_KEY in data: url = get_redirect(request, data, f.instance) raise HttpRedirect(url) # Save as new if forms.SAVE_AS_NEW_KEY in data and f.instance and f.instance.id: f.instance = view.mapper.save_as_new(f.instance, commit=False) # The form is valid. Invoke the submit_form method in the view if f.is_valid(): editing = bool(f.instance and f.instance.id) response = view.submit_form(request, f) if is_async(response): return response.add_callback( partial(_finish, request, editing, fhtml, force_redirect)) else: return _finish(request, editing, fhtml, force_redirect, response) else: if request.is_xhr: return fhtml.maker.json_messages(f) else: return view.get_response(request)
def render(self, request=None, **kwargs): '''Serialize ``self`` as a ``JSON`` string''' elem = maybe_async(self.serialize(request)) if is_async(elem): return elem.add_callback(self.dump) else: return self.dump(elem)
def testSimple(self): s = Deferred() elem = w('div', s) self.assertEqual(len(elem), 1) text = elem.render() self.assertTrue(is_async(text)) self.assertFalse(text.called) s.callback('ciao') self.assertTrue(text.called) text = text.result self.assertEqual(text,'<div>ciao</div>')
def testSimple(self): s = Deferred() elem = w('div', s) self.assertEqual(len(elem), 1) text = elem.render() self.assertTrue(is_async(text)) self.assertFalse(text.called) s.callback('ciao') self.assertTrue(text.called) text = text.result self.assertEqual(text, '<div>ciao</div>')
def page_tree(self): site = self.site Page = site.Page tree = site.tree if Page: pages = Page.query().all() if is_async(pages): return pages.add_callback(lambda pg: DjpcmsTree(tree, pg)) else: return DjpcmsTree(tree, pages) else: return DjpcmsTree(tree)
def response(self, request): '''Generate the Response''' self.content_type, response = request.content_type, None if not request.exc_info: try: if request.method not in request.methods(): raise HttpException(status=405) perm = maybe_async(request.has_permission()) while is_async(perm): yield None perm = maybe_async(perm) if is_failure(perm): request.exc_info = perm.trace elif not perm: raise PermissionDenied() else: content = request.view(request) except Exception as e: request.exc_info = sys.exc_info() if request.exc_info is None: content = self.safe_render(request, content) while is_async(content): yield content = self.safe_render(request, content) if is_failure(content): request.exc_info = content.trace content = b'' elif isinstance(content, WsgiResponse): response = content # Response not yet available, build it from content or exc_info if response is None: response = Response(content_type=self.content_type, encoding=request.encoding) if request.exc_info is not None: content = self.website.handle_error(request, response) if response.content_type == 'text/html' and not request.is_xhr: content = '\n'.join(html_doc_stream(request, content, response.status_code)) response.content = (to_bytes(content, response.encoding),) yield self.cache(request, response)
def response(self, request): '''Generate the Response''' self.content_type, response = request.content_type, None if not request.exc_info: try: if request.method not in request.methods(): raise HttpException(status=405) perm = maybe_async(request.has_permission()) while is_async(perm): yield None perm = maybe_async(perm) if is_failure(perm): request.exc_info = perm.trace elif not perm: raise PermissionDenied() else: content = request.view(request) except Exception as e: request.exc_info = sys.exc_info() if request.exc_info is None: content = self.safe_render(request, content) while is_async(content): yield content = self.safe_render(request, content) if is_failure(content): request.exc_info = content.trace content = b'' elif isinstance(content, WsgiResponse): response = content # Response not yet available, build it from content or exc_info if response is None: response = Response(content_type=self.content_type, encoding=request.encoding) if request.exc_info is not None: content = self.website.handle_error(request, response) if response.content_type == 'text/html' and not request.is_xhr: content = '\n'.join( html_doc_stream(request, content, response.status_code)) response.content = (to_bytes(content, response.encoding), ) yield self.cache(request, response)
def underlying_response(request, page): urlargs = dict(request_get_data(request).items()) if page: route = page.route try: url = route.url(**urlargs) except KeyError as e: url = route.path underlying = request.for_path(url, urlargs={}) if is_async(underlying): return underlying.add_callback( lambda r: _underlying_response(request, r)) else: return _underlying_response(request, underlying)
def make_request(environ, node, instance=None, cache=True): '''Internal method for creating a :class:`Request` instance.''' instance = orms.orm_instance(instance) if not node.error: view = node.view model = view.model if isclass(model): if not isinstance(instance, model): try: # get the instance of model if any instance = view.instance_from_variables(environ, node.urlargs) if is_async(instance): callback = partial(build_request, environ, node, cache) return instance.addBoth( partial(build_request, environ, node, cache)) except Exception as e: instance = as_failure(e) else: instance = None return build_request(environ, node, cache, instance)
def make_request(environ, node, instance=None, cache=True): '''Internal method for creating a :class:`Request` instance.''' instance = orms.orm_instance(instance) if not node.error: view = node.view model = view.model if isclass(model): if not isinstance(instance, model): try: # get the instance of model if any instance = view.instance_from_variables( environ, node.urlargs) if is_async(instance): callback = partial(build_request, environ, node, cache) return instance.addBoth( partial(build_request, environ, node, cache)) except Exception as e: instance = as_failure(e) else: instance = None return build_request(environ, node, cache, instance)