代码之家  ›  专栏  ›  技术社区  ›  Will McCutchen

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

  •  1
  • Will McCutchen  · 技术社区  · 15 年前

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

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

    处理文件上载时使用 webapp 谷歌应用引擎上的框架?

    我知道我可以用 self.request.get('field_name') 或使用 self.request.params['field_name'] 但是在我的例子中,我不知道字段名。我想让表单对象负责将它需要的数据从请求中提取出来(特别是因为表单以及传入的字段名都有前缀)。

    我正在将一种通用的CMS系统从django(已经在应用引擎上运行)移植到谷歌的webapp框架,这是最后一个主要的障碍。当创建一个新项目时,我希望能够直接将发布的参数和文件传递给该项目的django表单对象,这样我就不必提前知道表单中的哪些字段以及哪些字段是文件上载。使用django是可能的,但在webapp框架中我看不到任何简单的方法。

    3 回复  |  直到 15 年前
        1
  •  3
  •   Will McCutchen    15 年前

    这是我提出的解决方案。我在自定义中添加了以下方法 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())
    

    到目前为止这对我很有效。

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

        2
  •  0
  •   jbochi    15 年前

    看一看 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()
    
        3
  •  0
  •   Emilien    15 年前

    self.request.arguments() 包含可以使用 self.request.get('field_name') 如果你知道“场名”。

    因为您事先不知道字段的名称,所以您可能希望循环它的所有元素。如果字段名称有固定的前缀,例如 photo_cat photo_dog .