Загрузка файлов в App Engine с использованием форм webapp и Django - PullRequest
1 голос
/ 13 января 2010

Мой основной вопрос таков: есть ли эквивалент

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

при обработке загрузки файлов с использованием фреймворка webapp в Google App Engine?

Я знаю, что могу извлечь определенные загруженные данные файла, используя self.request.get('field_name'), или объект FieldStorage, используя self.request.params['field_name'], но в моем случае я заранее не знаю имен полей. Я хотел бы позволить объекту формы позаботиться о извлечении необходимых ему данных из запроса (особенно если формы и, следовательно, имена входящих полей имеют префиксы).

Я портирую своего рода стандартную систему CMS из Django (уже работающей в App Engine) на среду веб-приложений Google, и это последний серьезный камень преткновения. Когда создается новый элемент, я хотел бы иметь возможность просто передавать параметры и файлы POST непосредственно объекту формы Django для этого элемента, чтобы мне не приходилось заранее знать, какие поля находятся в форме и какие из этих полей являются загрузками файлов. Это было возможно с помощью Django, но я не вижу простого способа сделать это в рамках веб-приложения.

Ответы [ 3 ]

3 голосов
/ 13 января 2010

Вот решение, которое я придумал.Я добавил следующий метод к своему пользовательскому webapp.RequestHandler подклассу:

# 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)

Теперь при обработке загруженных файлов я могу сделать что-то вроде следующего:

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

Это хорошо работает дляменя пока.

(Я не знаю, плохая ли это форма ответа на мой вопрос. Извините, если это так.)

0 голосов
/ 16 января 2010

self.request.arguments() содержит все элементы, которые вы можете получить отдельно, используя self.request.get('field_name'), если вы знали 'field_name'.

Поскольку вы заранее не знаете названия своих полей, возможно, вы захотите зациклить все их элементы. Это бы хорошо работало, если имена ваших полей имеют фиксированный предид, например photo_cat и photo_dog.

0 голосов
/ 13 января 2010

Взгляните на app-engine-patch . request.FILES должно работать, если вы его используете.

Здесь также есть небольшой фрагмент , но я его не проверял:

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()
...