什么是Django中'yield'功能的替代品

时间:2011-03-01 12:54:48

标签: python django file-upload yield-keyword

'yield'函数将输出流式传输到浏览器,即它将值附加到响应。

我的要求是,不是“追加”,而是有任何内置函数覆盖旧值,或者只是说不会将新值附加到旧值上。?

解释我的要求:

以下是我的“views.py”中的函数:

def handle_uploaded_file(f):
    filename = "/media/Data/static/Data/" + f.name
    uploaded = 0
    perc = 0.0
    filesize = f.size
    destination = open(filename, 'wb+')
    for chunk in f.chunks():
        destination.write(chunk)
        uploaded = uploaded + len(chunk)
        yield(str((uploaded * 100) / filesize) + "% ")
    destination.close()
    yield(f.name + " (" + str(round(f.size/1024.0, 2)) + " KB) uploaded successfully.")

以下是上述功能的输出:

2% 4% 7% 9% 11% 14% 16% 18% 21% 23% 25% 28% 30% 32% 35% 37% 39% 42% 44% 46% 49% 51% 53% 56% 58% 60% 63% 65% 67% 70% 72% 74% 77% 79% 81% 84% 86% 89% 91% 93% 96% 98% 100% Butterfly.wmv (2732.16 KB) uploaded successfully.

如您所见,百分比会附加到先前传递的值,而我想用新值覆盖旧值。

Django / python中是否存在此行为的内置函数?或者我可以通过代码模拟这个吗?

提前致谢。

2 个答案:

答案 0 :(得分:3)

您无法覆盖已发送到浏览器的内容。这是一个远程网络连接,请记住:一旦发送了某些内容,就会发送它。

你需要用javascript或CSS做一些聪明的事情来获得你想要的结果。

答案 1 :(得分:0)

这个回应看起来很脏。

一般来说,大多数时候文件上传的进度条是使用JavaScript和Web服务器模块(我用Rails)或JSON视图(我用django)实现的,它以JSON方式返回上传状态。以下是一些模块:

  • Apache的upload_progress_module
  • nginx的HttpUploadProgressModule
  • lighttpd的mod_uploadprogress

请注意,这些模块考虑了Rails。但是它们应该让您了解返回进度的json视图的界面应该如何。并且有一些Java脚本示例,您可以大致了解JS部分应该如何工作。