Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 使用webapp和Django表单将文件上载到应用程序引擎_Python_Django_Google App Engine_Forms_File Upload - Fatal编程技术网

Python 使用webapp和Django表单将文件上载到应用程序引擎

Python 使用webapp和Django表单将文件上载到应用程序引擎,python,django,google-app-engine,forms,file-upload,Python,Django,Google App Engine,Forms,File Upload,我的基本问题是:是否有一个 form = MyForm(request.POST, request.FILES) 在谷歌应用程序引擎上使用webapp框架处理文件上传时 我知道我可以使用self.request.get('field_name')或使用self.request.params['field_name']]提取特定上传的文件数据,但就我而言,我事先不知道字段名称。我想让表单对象负责从请求中提取所需的数据(特别是因为表单以及传入的字段名都有前缀) 我正在将一种通用的CMS系统从Dja

我的基本问题是:是否有一个

form = MyForm(request.POST, request.FILES)
在谷歌应用程序引擎上使用
webapp
框架处理文件上传时

我知道我可以使用
self.request.get('field_name')
或使用
self.request.params['field_name']]
提取特定上传的文件数据,但就我而言,我事先不知道字段名称。我想让表单对象负责从请求中提取所需的数据(特别是因为表单以及传入的字段名都有前缀)

我正在将一种通用的CMS系统从Django(已经在AppEngine上运行)移植到Google的webapp框架,这是最后一个主要障碍。创建新项目时,我希望能够将发布的参数和文件直接传递给该项目的Django表单对象,这样我就不必提前知道表单中有哪些字段,以及哪些字段是文件上传的。使用Django可以做到这一点,但在webapp框架中我看不到任何简单的方法<代码>请求。如果您使用它,文件应该可以工作

还有一个小片段,但我没有测试它:

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

这是我想出的解决办法。我将以下方法添加到我的自定义
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())
到目前为止,这对我很有效


(我不知道回答我自己的问题是否不好。如果是,我很抱歉。)

self.request.arguments()
包含所有元素,如果您知道“field\u name”,可以使用
self.request.get('field\u name')
单独检索这些元素


由于您事先不知道字段的名称,因此可能需要在其所有元素上循环。如果字段的名称有固定的预处理,例如
photo\u cat
photo\u dog

不幸的是,我将从Django迁移到内置的webapp框架。查看常见问题解答中第一个条目的底部:“询问并回答自己的问题也很好,…”如果你看看我上面发布的解决方案,这正是我正在做的。除了循环使用
self.request.params.items()
。这对我有用。