【问题标题】:Whats the alternative to 'yield' function in DjangoDjango中'yield'函数的替代方法是什么
【发布时间】:2011-03-01 12:54:48
【问题描述】:

“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 中是否有针对这种行为的内置函数?或者我可以通过代码来模拟吗?

提前致谢。

【问题讨论】:

  • yield 并没有真正附加任何内容。就像您正在创建一个列表,只是不是一次创建整个列表,python 不会担心下一个结果,直到您要求它。您的问题的答案可能不在于您如何编写此函数,而在于您如何处理由它生成的值。
  • 您是否认为有另一种方法可以返回“上传的百分比”,这样我就看不到百分比序列而只看到一次?

标签: python django file-upload yield-keyword


【解决方案1】:

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

你需要巧妙地使用 javascript 或 CSS 来获得你想要的结果。

【讨论】:

  • +1 建议我应该使用 CSS / Javascript 做一些事情。也许我可以寻找“onchange()”javascript 函数。你说什么?
  • +1 正如丹尼尔所说,你必须编写客户端逻辑。
【解决方案2】:

这个响应的东西看起来很脏。

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

  • 用于 Apache 的上传进度模块
  • 用于 nginx 的 HttpUploadProgressModule
  • lighttpd 的 mod_uploadprogress

请注意,这些模块考虑到了 Rails。但他们应该让您了解返回进度的 json 视图的界面应该是什么样子。并提供一些 Java Script 示例,您可以大致了解 JS 部分的工作方式。

【讨论】:

  • 我遇到了 lighttpd 的“mod_uploadprogress”模块。我实际上在使用 lighttpd 时遇到了这个模块的“404 错误”...你有这个模块的经验吗?
  • 我只使用了 Apache 模块,你必须在那里指定 progress/?X-Progress-ID=123 并确保 lighttpd 配置正确。
猜你喜欢
  • 1970-01-01
  • 2017-03-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-11-13
  • 1970-01-01
  • 2011-04-25
  • 2019-05-22
相关资源
最近更新 更多