Как я могу использовать pysandbox в обработчике запросов Django?
Я хочу использовать pysandbox, чтобы пользователи могли запускать код на моем сервере. Я использую внутренний сервер Django (manage.py runserver) с этим обработчиком запросов:
def try_sandbox(request):
from sandbox import Sandbox
def func(a, b):
return a + b
sandbox = Sandbox()
result = sandbox.call(func, 1, 2)
return HttpResponse(result)
При доступе к странице я получаю ValueError:
Request Method: GET
Exception Type: ValueError
Exception Value: signal only works in main thread
Exception Location: /Library/Python/2.7/site-packages/sandbox/timeout.py in limitedTime, line 45
Python Executable: /usr/bin/python
Traceback:
Django Version: 1.3.1
Python Version: 2.7.1
File "[...]views.py" in try_sandbox
77. result = sandbox.call(func, 1, 2)
File "/Library/Python/2.7/site-packages/sandbox/sandbox_class.py" in call
44. return self._call(func, args, kw)
File "/Library/Python/2.7/site-packages/sandbox/sandbox_class.py" in _call
31. return limitedTime(timeout, func, *args, **kw)
File "/Library/Python/2.7/site-packages/sandbox/timeout.py" in limitedTime
45. old_alarm = signal(SIGALRM, signalHandler)
Можно ли использовать pysandbox в этой среде?
(Я думаю, что я использую pysandbox 1.1 - это то, что version.py в загрузке говорит. Папка загрузки говорит 1.0.1. Я использую Mac OS 10.7.2.)
1 ответ
Я сам не сталкивался с этой ошибкой, поэтому могу ошибаться - но похоже, что если pysandbox не нравится работать в неосновных потоках, вам следует убедиться, что он работает в основном потоке. Если вы посмотрите документацию по серверу запуска django, то, похоже, в версии разработки django была введена опция --nothreading. Если это то, что вы используете, то, возможно, стоит проверить. Например:
manage.py runserver --nothreading
В качестве альтернативы, если вы все еще не можете заставить его работать (и не возражаете против того, что эта идея, вероятно, очень неэффективна), вы можете запустить отдельный процесс, используя subprocess.check_output или аналогичный, и запустить оттуда свой песочничный код. Это действительно не блестящая идея по разным причинам, но определенно приведет к запуску кода песочницы из основного потока.