我目前有一个长时间运行的脚本,可以产生各种输出。我想要做的是在按下我的webapp上的按钮时运行此脚本,并使输出实时显示在网页上的文本区域中。我想知道使用Django实现这一目标的最简单方法。
答案 0 :(得分:1)
如果你在谈论实时输出,那么你需要使用AJAX。
要设置脚本,您可以在网页中找到一个发送AJAX请求的按钮。
function ajax_call_model(data_JSON_Request, object_id){
$(function jQuery_AJAX_model(){
$.ajax({
type: 'GET',
url: '/ajax_request/',
data: something,
datatype: "json",
success: function(data) {
$("#output_id").html(data);
},//success
error: function() {alert("failed...");}
});//.ajax
});//jQuery_AJAX
};//ajax_call
在视图中,您将拥有以下内容:
def ajax_request(request):
something = request.GET.get('something', '')# Receives from AJAX
output = #Does something with the request
jsonDump = json.dumps(str(output))
return HttpResponse(jsonDump, content_type='application/json')
答案 1 :(得分:1)
您需要的是WebSocket! django不直接支持,但我建议您查看Websockets for Django applications using Redis。我之前使用过它,它很容易设置和使用。
例如,创建一个django模板(例如output.html
):
<html>
...
<body>
<textarea id="output" row=3 cols=25></textarea>
<script>
var ws = new WebSocket('{{ ws_url }}');
ws.onmessage = function(e) {
$('#output').append(e.data);
};
</script>
</body>
</html>
然后创建一个脚本调用的方法,只要它想要将消息输出到文本区域:
def output_message(session_key, user, message):
conn = redis.StrictRedis()
ws_url = '{0}:{1}'.format(session_key, user)
conn.publish(ws_url, message)
最后,您需要在views.py
中指定一个呈现output.html
模板的方法:
def output_console(request):
template_values = {'ws_url':'ws://{SERVER_NAME}:{SERVER_PORT}/ws/{0}?subscribe-session'.format(request.user.id, **request.META)}
return render(request, 'output.html', template_values)
查看项目git repo上的chat server以获得更深入的代码示例。
希望有所帮助,祝你好运!