【问题标题】:Django File Upload Handler ErrorsDjango 文件上传处理程序错误
【发布时间】:2010-11-17 01:31:32
【问题描述】:

在 Django 中,我想在收到任何未以我指定的扩展名结尾的文件上传后立即停止它们。为此,我定义了一个自定义上传处理程序并将 new_file 编写为如下所示:

def new_file(self, field_name, file_name, content_type, content_length, charset=None):
    basename, extension = os.path.splitext(file_name)
    if extension != ".txt":
        raise StopUpload(True) # Error: Only .txt files are accepted

这可以很好地停止上传,但它也会清除 request.FILES。现在,当我的视图收到请求时,它无法判断上传处理程序是否导致文件丢失,并且我无法向用户显示有用的消息。

有没有办法将消息从上传处理程序传播到相应的视图,以便我可以向用户显示错误?我试过使用请求对象,但它是不可变的。

【问题讨论】:

    标签: django upload


    【解决方案1】:

    我找到了无法让它工作的原因和解决方案 也是。

    似乎 Django 对 request.FILES 使用惰性求值来 确定何时调用上传处理程序。因此,上传 仅当您尝试访问时才会触发处理程序 请求文件。此外,我正在使用的请求对象 (在我的情况下为 WSGIRequest)已经制作了 GET 和 POST 不可变字典, 所以我们不能通过那里传递信息。但是,META 仍然 可用于添加信息。

    我的组合解决方案在视图中包含“request.FILES”行 处理上传,这会强制上传处理程序开始。当。。。的时候 在 new_files 中捕获了错误,我将 self.request.META['error'] 设置为 错误消息并引发 StopUpload,这将我们推回到 无文件查看。最后,我检查 request.META['error'] 在 出现问题时查看并显示该消息。

    我希望这会有所帮助!

    【讨论】:

    • 仍然很好用,谢谢。如果当代 Django 中有比 request.META 更好的方法将此数据传递给视图,我很想听听。
    猜你喜欢
    • 2011-08-15
    • 2023-03-14
    • 1970-01-01
    • 2011-08-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-30
    • 1970-01-01
    相关资源
    最近更新 更多