Я пишу Django валидатор для файлов, загруженных с формой.Эти файлы представляют собой скрипты Python, которые могут содержать ошибки и / или быть небезопасными, поэтому я не должен выполнять их до полной проверки.
Одна проверка состоит в том, чтобы убедиться, что присутствуют оба метода "run" и "rollback",снова без выполнения кода .
Все загруженные скрипты Python имеют одинаковую структуру:
class Action(ActionGlobal):
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
def run(self, args):
print("custom code here")
...
def rollback(self,args):
print("custom code here")
...
Я нашел следующее решение, чтобы сделать это с AST:
import ast
codetoanalyze=ast.parse(open("/path/to/script_to_analyse.py",'r').read())
if next((x for x in codetoanalyze.body[1].body if x.name == "run"), None) == None :
raise ValidationError( _('Package error : module must contain a "run" method'), code='compilation_error', )
if next((x for x in codetoanalyze.body[1].body if x.name == "rollback"), None) == None :
raise ValidationError( _('Package error : module must contain a "rollback" method'), code='compilation_error', )
Работает нормально, но не очень элегантно (body 1 ...), и, поскольку я никогда раньше не использовал модуль AST, я считаю, что может быть умнееспособ достижения этого.
Есть предложения?