【问题标题】:Uploading files to App Engine using webapp and Django forms使用 webapp 和 Django 表单将文件上传到 App Engine
【发布时间】:2011-01-04 09:24:00
【问题描述】:

我的基本问题是:是否有类似的

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

在使用 Google App Engine 上的 webapp 框架处理文件上传时?

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

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

【问题讨论】:

    标签: python django google-app-engine forms file-upload


    【解决方案1】:

    看看app-engine-patchrequest.FILES 如果你使用它应该可以工作。

    还有一点sn-phere,不过我没测试过:

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

    【讨论】:

    • 不幸的是,我正在离开从 Django 内置的 webapp 框架。
    【解决方案2】:

    这是我想出的解决方案。我在我的自定义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())
    

    到目前为止,这对我来说效果很好。

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

    【讨论】:

    • 查看常见问题解答中第一个条目的底部:“提出并回答您自己的问题也很好,...”
    【解决方案3】:

    self.request.arguments() 包含所有可以使用self.request.get('field_name') 单独检索的元素,如果您知道 'field_name'。

    由于您事先不知道字段的名称,因此您可能希望循环访问其中的所有元素。如果您的字段名称有一个固定的前缀,例如 photo_catphoto_dog,这将工作得很好。

    【讨论】:

    • 如果您查看我在上面发布的解决方案,这正是我正在做的。除了我正在循环遍历self.request.params.items()。它对我有用。
    猜你喜欢
    • 2014-12-28
    • 1970-01-01
    • 2010-12-07
    • 1970-01-01
    • 2013-12-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-07
    相关资源
    最近更新 更多