minor compileapp refactor

This commit is contained in:
ilvalle
2016-09-28 21:49:24 +02:00
parent 78cc6d69a2
commit a31cf09dd3
3 changed files with 31 additions and 32 deletions
+27 -26
View File
@@ -230,8 +230,8 @@ def LOAD(c=None, f='index', args=None, vars=None,
if isinstance(page, dict): if isinstance(page, dict):
other_response._vars = page other_response._vars = page
other_response._view_environment.update(page) other_response._view_environment.update(page)
run_view_in(other_response._view_environment) page = run_view_in(other_response._view_environment)
page = other_response.body.getvalue()
current.request, current.response = original_request, original_response current.request, current.response = original_request, original_response
js = None js = None
if ajax_trap: if ajax_trap:
@@ -309,8 +309,8 @@ class LoadFactory(object):
if isinstance(page, dict): if isinstance(page, dict):
other_response._vars = page other_response._vars = page
other_response._view_environment.update(page) other_response._view_environment.update(page)
run_view_in(other_response._view_environment) page = run_view_in(other_response._view_environment)
page = other_response.body.getvalue()
current.request, current.response = original_request, original_response current.request, current.response = original_request, original_response
js = None js = None
if ajax_trap: if ajax_trap:
@@ -577,13 +577,11 @@ def run_models_in(environment):
if not regex.search(fname) and c != 'appadmin': if not regex.search(fname) and c != 'appadmin':
continue continue
elif compiled: elif compiled:
code = getcfs(model, model, lambda: read_pyc(model)) f = lambda: read_pyc(model)
else: else:
code = getcfs(model, model, f = lambda: compile2(read_file(model), model)
lambda: compile2(read_file(model), model)) ccode = getcfs(model, model, f)
restricted(ccode, environment, layer=model)
restricted(code, environment, layer=model)
def run_controller_in(controller, function, environment): def run_controller_in(controller, function, environment):
""" """
@@ -594,17 +592,17 @@ def run_controller_in(controller, function, environment):
# if compiled should run compiled! # if compiled should run compiled!
folder = current.request.folder folder = current.request.folder
path = pjoin(folder, 'compiled') cpath = pjoin(folder, 'compiled')
badc = 'invalid controller (%s/%s)' % (controller, function) badc = 'invalid controller (%s/%s)' % (controller, function)
badf = 'invalid function (%s/%s)' % (controller, function) badf = 'invalid function (%s/%s)' % (controller, function)
if os.path.exists(path): if os.path.exists(cpath):
filename = pjoin(path, 'controllers.%s.%s.pyc' filename = pjoin(cpath, 'controllers.%s.%s.pyc'
% (controller, function)) % (controller, function))
if not os.path.exists(filename): if not os.path.exists(filename):
raise HTTP(404, raise HTTP(404,
rewrite.THREAD_LOCAL.routes.error_message % badf, rewrite.THREAD_LOCAL.routes.error_message % badf,
web2py_error=badf) web2py_error=badf)
code = getcfs(filename, filename, lambda: read_pyc(filename)) ccode = getcfs(filename, filename, lambda: read_pyc(filename))
elif function == '_TEST': elif function == '_TEST':
# TESTING: adjust the path to include site packages # TESTING: adjust the path to include site packages
from gluon.settings import global_settings from gluon.settings import global_settings
@@ -623,6 +621,7 @@ def run_controller_in(controller, function, environment):
environment['__symbols__'] = environment.keys() environment['__symbols__'] = environment.keys()
code = read_file(filename) code = read_file(filename)
code += TEST_CODE code += TEST_CODE
ccode = compile2(code, filename)
else: else:
filename = pjoin(folder, 'controllers/%s.py' filename = pjoin(folder, 'controllers/%s.py'
% controller) % controller)
@@ -636,11 +635,11 @@ def run_controller_in(controller, function, environment):
raise HTTP(404, raise HTTP(404,
rewrite.THREAD_LOCAL.routes.error_message % badf, rewrite.THREAD_LOCAL.routes.error_message % badf,
web2py_error=badf) web2py_error=badf)
code = "%s\nresponse._vars=response._caller(%s)\n" % (code, function) code = "%s\nresponse._vars=response._caller(%s)" % (code, function)
layer = filename + ':' + function layer = "%s:%s" % (filename, function)
code = getcfs(layer, filename, lambda: compile2(code, layer)) ccode = getcfs(layer, filename, lambda: compile2(code, layer))
restricted(code, environment, layer=filename) restricted(ccode, environment, layer=filename)
response = current.response response = current.response
vars = response._vars vars = response._vars
if response.postprocessing: if response.postprocessing:
@@ -663,9 +662,10 @@ def run_view_in(environment):
response = current.response response = current.response
view = environment['response'].view view = environment['response'].view
folder = request.folder folder = request.folder
path = pjoin(folder, 'compiled') cpath = pjoin(folder, 'compiled')
badv = 'invalid view (%s)' % view badv = 'invalid view (%s)' % view
patterns = response.get('generic_patterns') patterns = response.get('generic_patterns')
layer = None
if patterns: if patterns:
regex = re_compile('|'.join(map(fnmatch.translate, patterns))) regex = re_compile('|'.join(map(fnmatch.translate, patterns)))
short_action = '%(controller)s/%(function)s.%(extension)s' % request short_action = '%(controller)s/%(function)s.%(extension)s' % request
@@ -678,10 +678,10 @@ def run_view_in(environment):
layer = 'file stream' layer = 'file stream'
else: else:
filename = pjoin(folder, 'views', view) filename = pjoin(folder, 'views', view)
if os.path.exists(path): # compiled views if os.path.exists(cpath): # compiled views
x = view.replace('/', '.') x = view.replace('/', '.')
files = ['views.%s.pyc' % x] files = ['views.%s.pyc' % x]
is_compiled = os.path.exists(pjoin(path, files[0])) is_compiled = os.path.exists(pjoin(cpath, files[0]))
# Don't use a generic view if the non-compiled view exists. # Don't use a generic view if the non-compiled view exists.
if is_compiled or (not is_compiled and not os.path.exists(filename)): if is_compiled or (not is_compiled and not os.path.exists(filename)):
if allow_generic: if allow_generic:
@@ -693,11 +693,11 @@ def run_view_in(environment):
files.append('views.generic.pyc') files.append('views.generic.pyc')
# end backward compatibility code # end backward compatibility code
for f in files: for f in files:
compiled = pjoin(path, f) compiled = pjoin(cpath, f)
if os.path.exists(compiled): if os.path.exists(compiled):
code = getcfs(compiled, compiled, lambda: read_pyc(compiled)) ccode = getcfs(compiled, compiled, lambda: read_pyc(compiled))
restricted(code, environment, layer=compiled) layer = compiled
return break
if not os.path.exists(filename) and allow_generic: if not os.path.exists(filename) and allow_generic:
view = 'generic.' + request.extension view = 'generic.' + request.extension
filename = pjoin(folder, 'views', view) filename = pjoin(folder, 'views', view)
@@ -713,7 +713,8 @@ def run_view_in(environment):
context=environment), context=environment),
layer)) layer))
restricted(ccode, environment, layer=layer) restricted(ccode, environment, layer=layer)
# parse_template saves everything in response body
return environment['response'].body.getvalue()
def remove_compiled_application(folder): def remove_compiled_application(folder):
""" """
+2 -4
View File
@@ -439,13 +439,11 @@ class Response(Storage):
from gluon._compat import StringIO from gluon._compat import StringIO
(obody, oview) = (self.body, self.view) (obody, oview) = (self.body, self.view)
(self.body, self.view) = (StringIO(), view) (self.body, self.view) = (StringIO(), view)
run_view_in(self._view_environment) page = run_view_in(self._view_environment)
page = self.body.getvalue()
self.body.close() self.body.close()
(self.body, self.view) = (obody, oview) (self.body, self.view) = (obody, oview)
else: else:
run_view_in(self._view_environment) page = run_view_in(self._view_environment)
page = self.body.getvalue()
return page return page
def include_meta(self): def include_meta(self):
+2 -2
View File
@@ -180,8 +180,8 @@ def serve_controller(request, response, session):
if isinstance(page, dict): if isinstance(page, dict):
response._vars = page response._vars = page
response._view_environment.update(page) response._view_environment.update(page)
run_view_in(response._view_environment) page = run_view_in(response._view_environment)
page = response.body.getvalue()
# logic to garbage collect after exec, not always, once every 100 requests # logic to garbage collect after exec, not always, once every 100 requests
global requests global requests
requests = ('requests' in globals()) and (requests + 1) % 100 or 0 requests = ('requests' in globals()) and (requests + 1) % 100 or 0