我有一个jquery moblie前端,用于运行django的网站。我有一个用例,有些事情可能需要很长时间才能完成,所以我希望用户看到它的进展;在我的例子中,它是一系列事件以及它们是成功还是失败。
在后端,我有一个CCD_ 1对象,它吐出这些信息。它被包裹在CCD_ 2对象周围,以便完成更新的流方面。一个简单的网页(只有html和body标记)表明它可以按预期工作。
然而,jquerymobile(至少在默认情况下)喜欢在显示之前加载整个页面
我不介意将此输出显示为对话框。
有什么想法吗?
您可以使用常见的AJAX请求轮询Django以获取进度更新。
它不能解决jquery移动和长轮询问题,但它为您提供了将长时间运行的任务从前端转移到后端所需的灵活性(例如使用Celery)。
为了保持性能,我建议将长期运行的任务的状态更新为memcached实例。
在您的视图中,只需获取进度并返回,即,这将触发对话框或更新一些div。更好的是,只显示结果。
只是为了更新我的经验。
所以最后,我把大部分时间都花在了jquerymobile上。当然,如果我事先做了rtfm,我可能会头疼得更小!基本上,ajax页面更新非常烦人,所以这里重要的是在我的html form
上使用rel="external"
或data-ajax="false"
禁用它们,而且,由于使用#的方式,您还需要将这些标签添加到加载该页面的任何页面中(否则多页将无法正常工作)。
然后,我创建了一个多页jqm页面,并通过提交按钮链接到它(在我使用data-rel="dialog"
的情况下),第二个页面有一个空的iframe
;我将表单target
设置为此iframe,瞧!它有效!表单提交的流式处理结果显示为应该显示的结果。
所以总结一下:
- 返回djangoHttpResponse,其中它的参数是生成器对象。这使得输出具有流性质
-
创建jqm页面:
<div id="main" data-role="page"> <div data-role="content"> <form id="myform" method="post" target="response-iframe" action="***django generator page***" data-ajax="false"> ... <a id="submit-button" href="#secondary" data-rel="dialog" data-role="button" data-theme="e">Submit</a> <script> $('#submit-button').live( 'click', function(){ $('#port-form').submit() }) </script> </form> </div> </div> <div id="secondary" data-role="page"> <div data-role="content"> <iframe id="response-iframe"></iframe> </div> </div>