2011-12-06 70 views
2

我想使用pysandbox來允許用戶在我的服務器上運行代碼。我使用Django的內部服務器(manage.py runserver命令)這個請求處理程序:如何在Django請求處理程序中使用pandandbox?

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

請詳細描述您的環境。你使用什麼網絡服務器? 在Python 2.6.6 x64,Django 1.3.0和pysandbox 1.0.3上,它沒有任何例外的django內部服務器(manage.py runserver)。 – utapyngo

+0

@utapyngo我添加了一些信息。今天晚些時候我會嘗試一個非主要的pandandbox分支。 – fgm2r

+0

至少你應該粘貼完整詳細的錯誤信息... –

回答

2

我自己沒有遇到這個錯誤,所以我可能是絕對錯誤的 - 但它看起來像是如果pysandbox不喜歡在非主線程上運行,那麼你應該確保它在主線程上運行。如果你看看django runserver documentation,django的開發版本中似乎已經引入了--nothreading選項。如果這是你正在運行的,那麼它可能值得檢查。例如:

manage.py runserver --nothreading 

另外,如果您仍然無法得到它的工作(並且不介意這個想法可能非常低效的),你可以關閉產卵使用subprocess.check_output或類似一個獨立的進程,並運行沙盒代碼。由於各種原因,這確實不是一個好主意,但肯定會導致沙箱代碼從主線程運行。

+0

我已經安裝了開發版本並使用了--nothreading,但它沒有什麼區別。如有必要,我可能會使用單獨的過程。 (我不得不運行很多小代碼塊並創建很多進程,或者嘗試使整個系統在沙箱中運行。) – fgm2r

相關問題