2010-01-12 40 views
1

我的基本問題是:是否有使用在谷歌應用程序引擎的webapp框架處理文件上傳時文件上傳到App Engine的web應用和Django的形成

form = MyForm(request.POST, request.FILES) 

等效?

我知道我可以使用self.request.get('field_name')或使用self.request.params['field_name']的FieldStorage對象來提取特定的上傳文件數據,但在我的情況下,我並不事先知道字段名稱。我想讓表單對象負責將需要的數據從請求中拉出(尤其是因爲表單以及傳入的字段名都有前綴)。

我從Django(已經在App Engine上運行)向Google的webapp框架移植一種通用CMS系統,這是最後一個主要的絆腳石。當創建一個新項目時,我希望能夠將POST的參數和文件直接傳遞給該項目的Django表單對象,這樣我就不必提前知道表單中的字段以及哪些字段是文件上傳。這可以使用Django,但我看不到任何簡單的方法在webapp框架中完成它。

回答

3

這是我想出了一個解決方案。我添加下面的方法來我的自定義webapp.RequestHandler子類:對我來說

form = MyForm(self.request.params, self.get_uploaded_files()) 

這種運作良好,到目前爲止:

# Required imports 
import cgi 
from django.core.files.uploadedfile import SimpleUploadedFile 

def get_uploaded_files(self): 
    """Gets a dictionary mapping field names to SimpleUploadedFile objects 
    for each uploaded file in the given params. Suitable for passing to a 
    Django form as the `files` argument.""" 
    return dict((k, SimpleUploadedFile(v.filename, v.file.read())) 
       for k, v in self.request.params.items() 
       if isinstance(v, cgi.FieldStorage) and v.file) 

現在,處理上傳文件的時候,我可以這樣做以下。

(我不知道這是不好的形式來回答我的問題。我很抱歉,如果它是。)

+0

查看常見問題解答中第一個條目的底部:「提問並回答自己的問題也很好,......」 – 2010-01-13 17:50:09

0

看一看app-engine-patch。如果您使用它,request.FILES應該可以工作。

還有一個小片段here,但我沒有測試它:

if request.method == 'POST': 
    form = MyImageUploadForm(request.POST, request.FILES) 
    if form.is_valid(): 
     themodel = MyImageModel() 
     themodel.data = form.cleaned_data['file'].read() 
     themodel.content_type = form.cleaned_data['file'].content_type 
     themodel.put() 
    else: 
     form = MyImageUploadForm() 
+0

不幸的是,我正將* from *從Django *移動到*內置的webapp框架。 – 2010-01-13 17:35:58

0

self.request.arguments()包含了所有你可以檢索的元素分別使用self.request.get('field_name')如果你知道「FIELD_NAME 」。

由於您事先不知道字段的名稱,因此您可能需要循環所有元素。如果您的字段的名稱有一個固定的前置碼,這將工作得很好,如photo_catphoto_dog

+0

如果你看看我上面發佈的解決方案,這正是我正在做的。除了我正在循環'self.request.params.items()'而不是。它爲我工作。 – 2010-01-18 15:26:52

相關問題