Получение текстового файла django для запуска в виде кода
Я пытаюсь начать работу над проектом и использую для этого Django. У меня есть один из атрибутов в моделях start_lines = models.TextField(blank=True, null=True). Эти строки нужны для того, чтобы запустить код с функцией exec(). В качестве одного из них у меня есть
from .code.Lot_sizing_codes import lot_size
ls = lot_size(K, h, r, True)
output, extra_output = (ls.{str(Functions.objects.get(id=request.POST["function_to_call"]))}({request.POST["inputExtras"]}))
Я должен запустить это через функцию, чтобы отобразить то, что я хочу:
def showProgramX(request, pk):
program = Program.objects.get(id=pk)
form = ProgramInputForm()
keys = ""
vars = []
for var in program.inputvariables.split(","):
var_name, var_type = var.split("=")
keys += f"""
<tr>
<th><label for="{var_name}">{var_name}:</label></th>
<td><input type="text" name="{var_name}" maxlength="1000" class="input" id="id_inputvariables"></td>
</tr>"""
vars.append(var_name)
content = {"program": program, "form": form, "keys": keys}
if request.method == "POST":
form1 = ProgramInputForm(request.POST)
import json
req = request.POST
for var in vars:
line = f"""{var} = {req[f'{var}']}"""
exec(line, globals())
exec(program.start_lines, globals())
content["output"] = output
content["extra_output"] = extra_output
content['form'] = form1
return render(request, "programs/program.html", content)
вывод, если я напечатаю program.start_lines, должен быть таким
в этом случае {str(Functions.objects.get(id=request.POST["function_to_call"]))} = all
а {request.POST["inputExtras"]} - ничего/пусто
from .code.Lot_sizing_codes import lot_size
ls = lot_size(K, h, r, True)
output, extra_output = (ls.all())
где я фактически получаю
from .code.Lot_sizing_codes import lot_size
ls = lot_size(K, h, r, True)
output, extra_output = (ls.{str(Functions.objects.get(id=request.POST["function_to_call"]))}({request.POST["inputExtras"]}))
Кто-нибудь знает, что я могу сделать, чтобы обойти это, я перепробовал все, что мог.
Я понял. Так что теперь просто делюсь знаниями.
Я использовал шаблоны, вдохновившись https://realpython.com/python-string-formatting/
from string import Template
t = Template(program.start_lines)
print(t.substitute(function =str(Functions.objects.get(id=request.POST["function_to_call"])), argskwargs=request.POST["inputExtras"] ))
и поместите в текстовое поле следующее
from .code.Lot_sizing_codes import lot_size
ls = lot_size(K, h, r, True)
output, extra_output = (ls.$function($argskwargs))