如何在Django请求处理器中使用pysandbox?

2 投票
1 回答
520 浏览
提问于 2025-04-17 07:48

我想用 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 个回答

2

我自己没有遇到过这个错误,所以可能说得不对——但看起来如果pysandbox不喜欢在非主线程上运行,那你就应该确保它在主线程上运行。如果你查看一下django runserver的文档,似乎在django的开发版本中引入了一个--nothreading选项。如果你正在使用这个版本,值得一试。例如:

manage.py runserver --nothreading

另外,如果你还是无法让它正常工作(而且不介意这个想法可能效率很低),你可以使用subprocess.check_output或者类似的方法来启动一个单独的进程,然后从那里运行你的沙盒代码。虽然这个主意并不是很好,原因有很多,但这样做肯定会让沙盒代码在主线程中运行。

撰写回答