2009-12-12 88 views
2

實際上這裏有幾個問題。對於我所做的,我正在用Django 1.1和Google App Engine進行基本的圖片上傳。這裏是我的表單類:Google App Engine中的Django表單無法找到模塊PIL

class UploadPictureForm(forms.Form): 
    picture = forms.ImageField() 

,然後提交,我有以下代碼:

def handle_picture(request): 
    form = UploadPictureForm(request.POST, request.FILES) 

    if form.is_valid(): 
     save_picture(request.FILES['picture'] 

我得到以下錯誤:

Exception Type: ImportError 
Exception Value: No module named PIL 
Exception Location:  /Library/Python/2.6/site-packages/django/forms/fields.py in clean, line 495 
Python Executable: /usr/bin/python2.6 
Python Version: 2.6.1 
Python Path: [..., '/Library/Python/2.6/site-packages', '/Library/Python/2.6/site-packages/PIL'] 

和我已經安裝PIL在site-packages目錄中,如果我從命令行運行python,我可以導入PIL與import PIL

SO問題#1是爲什麼這不起作用? GAE是否在做一些使其不起作用的事情?第二件事是我注意到GAE有一些Image API。我應該使用它們嗎?所有這些對我來說都有些新意。

回答

3

對於初學者,您不應該在Python 2.6中使用GAE。 Google App Engine創建時考慮到了2.5,並且它通常在2.6中以多種方式中斷。

更多,我不確定你可以在GAE中使用PIL。這是一個基於C的庫,因此對於GAE來說是不可能的(它要求定製軟件包只是純Python)(這個問題甚至有a ticket)。

這就是images API的創建目的。它仍然使用PIL作爲後端(至少在用戶端),但提供了一個「安全」的子集。

+0

這一切都有道理。我一直想切換到2.5,但還沒有機會。至於使用PIL,這是有道理的。我可以輕鬆使用Images API。令人驚訝的是,我得到一個模塊沒有找到錯誤。這裏的想法是,GAE只是忽略了它所知道的基於C的模塊?只是在這裏好奇,答案不是非常重要。 – Bialecki 2009-12-12 23:23:46

+0

哇,有趣的故事!你甚至可以在Python的REPL中導入PIL?我已經通過easy_install安裝了PIL,但我不能!然後我從源和賓果重新編譯整個事情!它現在有效。 (在這兩種情況下'import Image'完美無缺)。 – 2009-12-13 01:52:26

0

你能告訴我們完整的堆棧跟蹤嗎?根據您提供的內容,有以下幾種選擇:

  1. Django試圖直接使用PIL出於某種原因。這在App Engine上不起作用,因爲PIL在那裏不可用,並且您不能上載它,因爲它是C代碼。
  2. 你自己的代碼試圖直接使用PIL。您需要改用Images API。
  3. App Engine框架試圖使用PIL,但找不到它。 Images API的本地存根依賴於PIL,因此如果您的代碼嘗試使用該代碼,App Engine需要導入PIL。
0

More, I'm not quite sure you can use PIL at all with GAE. It's a C-based library and therefore it's a no-no for GAE (which requires custom packages to be pure-Python only) (there's even a ticket for this issue).

PIL所使用的開發服務器在本地,以模擬所有圖像API調用。你可以找到installation instructions here

相關問題