Merge pull request #1668 from ilvalle/fix_compile_views

fix performance regression with compiled views
This commit is contained in:
mdipierro
2017-07-10 14:17:04 -05:00
committed by GitHub
+15 -13
View File
@@ -606,13 +606,13 @@ def run_controller_in(controller, function, environment):
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(cpath): if os.path.exists(cpath):
filename = pjoin(cpath, 'controllers.%s.%s.pyc' filename = pjoin(cpath, 'controllers.%s.%s.pyc' % (controller, function))
% (controller, function)) try:
if not os.path.exists(filename): ccode = getcfs(filename, filename, lambda: read_pyc(filename))
except IOError:
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)
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
@@ -633,13 +633,13 @@ def run_controller_in(controller, function, environment):
code += TEST_CODE code += TEST_CODE
ccode = compile2(code, filename) ccode = compile2(code, filename)
else: else:
filename = pjoin(folder, 'controllers/%s.py' filename = pjoin(folder, 'controllers/%s.py' % controller)
% controller) try:
if not os.path.exists(filename): code = getcfs(filename, filename, lambda: read_file(filename))
except IOError:
raise HTTP(404, raise HTTP(404,
rewrite.THREAD_LOCAL.routes.error_message % badc, rewrite.THREAD_LOCAL.routes.error_message % badc,
web2py_error=badc) web2py_error=badc)
code = getcfs(filename, filename, lambda: read_file(filename))
exposed = find_exposed_functions(code) exposed = find_exposed_functions(code)
if function not in exposed: if function not in exposed:
raise HTTP(404, raise HTTP(404,
@@ -715,12 +715,14 @@ def run_view_in(environment):
raise HTTP(404, raise HTTP(404,
rewrite.THREAD_LOCAL.routes.error_message % badv, rewrite.THREAD_LOCAL.routes.error_message % badv,
web2py_error=badv) web2py_error=badv)
layer = filename
# Compile the template
ccode = parse_template(view,
pjoin(folder, 'views'),
context=environment)
# if the view is not compiled
if not layer:
# Compile the template
ccode = parse_template(view,
pjoin(folder, 'views'),
context=environment)
layer = filename
restricted(ccode, environment, layer=layer) restricted(ccode, environment, layer=layer)
# parse_template saves everything in response body # parse_template saves everything in response body
return environment['response'].body.getvalue() return environment['response'].body.getvalue()