|
|
|
@@ -1,10 +1,13 @@ |
|
|
|
import json |
|
|
|
import re |
|
|
|
from base64 import b64encode |
|
|
|
|
|
|
|
from core.helper.code_executor.template_transformer import TemplateTransformer |
|
|
|
|
|
|
|
PYTHON_RUNNER = """ |
|
|
|
import jinja2 |
|
|
|
from json import loads |
|
|
|
from base64 import b64decode |
|
|
|
|
|
|
|
template = jinja2.Template('''{{code}}''') |
|
|
|
|
|
|
|
@@ -12,7 +15,8 @@ def main(**inputs): |
|
|
|
return template.render(**inputs) |
|
|
|
|
|
|
|
# execute main function, and return the result |
|
|
|
output = main(**{{inputs}}) |
|
|
|
inputs = b64decode('{{inputs}}').decode('utf-8') |
|
|
|
output = main(**loads(inputs)) |
|
|
|
|
|
|
|
result = f'''<<RESULT>>{output}<<RESULT>>''' |
|
|
|
|
|
|
|
@@ -39,6 +43,7 @@ JINJA2_PRELOAD_TEMPLATE = """{% set fruits = ['Apple'] %} |
|
|
|
|
|
|
|
JINJA2_PRELOAD = f""" |
|
|
|
import jinja2 |
|
|
|
from base64 import b64decode |
|
|
|
|
|
|
|
def _jinja2_preload_(): |
|
|
|
# prepare jinja2 environment, load template and render before to avoid sandbox issue |
|
|
|
@@ -60,9 +65,11 @@ class Jinja2TemplateTransformer(TemplateTransformer): |
|
|
|
:return: |
|
|
|
""" |
|
|
|
|
|
|
|
inputs_str = b64encode(json.dumps(inputs, ensure_ascii=False).encode()).decode('utf-8') |
|
|
|
|
|
|
|
# transform jinja2 template to python code |
|
|
|
runner = PYTHON_RUNNER.replace('{{code}}', code) |
|
|
|
runner = runner.replace('{{inputs}}', json.dumps(inputs, indent=4, ensure_ascii=False)) |
|
|
|
runner = runner.replace('{{inputs}}', inputs_str) |
|
|
|
|
|
|
|
return runner, JINJA2_PRELOAD |
|
|
|
|