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()
。这对我有用。