Django中'yield'函数的替代方案是什么

0 投票
2 回答
1859 浏览
提问于 2025-04-16 12:44

‘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

这个响应的东西看起来有点复杂。

一般来说,大多数情况下,文件上传的进度条是通过JavaScript和一个网页服务器模块来实现的(我在Rails中用过这个),或者是一个返回上传状态的JSON视图(我在Django中用过)。这里有一些模块:

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

需要注意的是,这些模块主要是为Rails设计的。不过,它们可以给你一个关于你的JSON视图应该如何返回进度的想法。同时,还有一些JavaScript的例子,可以让你大致了解JS部分应该怎么工作。

3

你不能覆盖已经发送给浏览器的内容。记住,这是一种远程网络连接:一旦发送出去的东西,就无法再改变了。

你需要用一些巧妙的JavaScript或CSS来实现你想要的效果。

撰写回答