2009-12-12 66 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

相关问题