Отправка экземпляра функции через API (django)
Возможно глупый вопрос:) У меня есть два приложения Django, мне нужно одно из них, чтобы использовать функции другого без их импорта. как будто я запрашиваю их с помощью API, есть ли способ получить экземпляр функции и использовать его, я не хочу делать следующее:
response = requests.get('HTTP://URL/example/', data)
data = response.json()
Я хочу вместо этого сделать что-то вроде этого
function = requests.get('HTTP://URL/example/')
и выполнить функцию следующим образом
data = function()
Спасибо
1 ответ
Ты можешь использовать marshal
модуль для сериализации кода функции, добавления его в качестве содержимого запроса и десериализации в другом приложении.
In [13]: def foo(a, b):
print a + b
....:
In [14]: import marshal
In [15]: a = marshal.dumps(foo.func_code)
In [16]: a
Out[16]:
'c\x02\x00\x00\x00\x02\x00\x00\x00\x02\x00\x00\x00C\x00\x00\x00s\r\x00\x00\x00|\x00\x00|\x01\x00\x17GHd\x00\x00S(\x01\x00\x00\x00N(\x00\x00\x00\x00(\x02\x00\x00\x00t\x01\x00\x00\x00at\x01\x00\x00\x00b(\x00\x00\x00\x00(\x00\x00\x00\x00s\x1f\x00\x00\x00<ipython-input-13-a0f238eac2f8>t\x03\x00\x00\x00foo\x01\x00\x00\x00s\x02\x00\x00\x00\x00\x01'
Другой переводчик:
In [13]: import marshal, types
In [14]: a = marshal.loads('c\x02\x00\x00\x00\x02\x00\x00\x00\x02\x00\x00\x00C\x00\x00\x00s\r\x00\x00\x00|\x00\x00|\x01\x00\x17GHd\x00\x00S(\x01\x00\x00\x00N(\x00\x00\x00\x00(\x02\x00\x00\x00t\x01\x00\x00\x00at\x01\x00\x00\x00b(\x00\x00\x00\x00(\x00\x00\x00\x00s\x1e\x00\x00\x00<ipython-input-1-a0f238eac2f8>t\x03\x00\x00\x00foo\x01\x00\x00\x00s\x02\x00\x00\x00\x00\x01')
In [15]: types.FunctionType(a, globals(), 'foo')(1, 2)
3
Однако вы должны убедиться, что никто не отправит вам вредоносный код перед его выполнением. Также обратите внимание, что у вас не будет доступа ни к каким глобальным переменным, которые определены в исходном модуле функции.
Вообще я бы не рекомендовал такой подход. Лучше просто использовать RestAPI для получения желаемых результатов, а не передавать функции.