Как я могу использовать 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 или аналогичный, и запустить оттуда свой песочничный код. Это действительно не блестящая идея по разным причинам, но определенно приведет к запуску кода песочницы из основного потока.

Другие вопросы по тегам