V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
mylifcc
V2EX  ›  Django

用 django 调用长时间执行的脚本,如何返还输出呢?

  •  
  •   mylifcc · 2023-05-09 18:13:11 +08:00 · 2273 次点击
    这是一个创建于 568 天前的主题,其中的信息可能已经有所发展或是发生改变。

    我想用 django 做一个接口,接到 start 请求后,就执行一个 python 脚本,同时可以将输出或日志返还给前端,接到 stop 请求就 kill 脚本,这样如何写比较合理呢? 用 celery 写了一下,但是无法结束进程,不知道原因,也搞不定日志。。。

    第 1 条附言  ·  2023-05-11 18:37:12 +08:00
    其实我想要的是一种监控无限运行的脚本的方式,如果获取到脚本的输出,就可以把输出拿到任何地方,重点是在阻塞的脚本中获取。搞不明白这里
    5 条回复    2023-05-10 11:33:02 +08:00
    baoyinhe
        1
    baoyinhe  
       2023-05-09 18:48:43 +08:00
    输出存 redis 或数据库,kill 脚本可以看一下这个 base64 aHR0cHM6Ly9qdWVqaW4uY24vcG9zdC83MTE5Njc4MjQ0ODU2NjkyNzcz
    Lucups
        2
    Lucups  
       2023-05-09 18:55:36 +08:00
    建议使用 websocket

    或者考虑一下 xterm.js
    37Y37
        3
    37Y37  
       2023-05-09 19:39:34 +08:00 via Android
    yinmin
        4
    yinmin  
       2023-05-09 23:51:52 +08:00
    如果并发量不大的话,可以直接 ajax 使用 stream 流,log 信息通过 yield 返回

    服务器端代码:

    from django.http import StreamingHttpResponse
    import time

    def stream_response(request):
    def data():
    for i in range(10):
    time.sleep(1)
    try:
    yield f"data: {i}\n\n"
    except GeneratorExit:
    # 在这里执行清理操作,例如关闭数据库连接或释放其他资源
    print("Client closed the connection.")
    raise

    response = StreamingHttpResponse(data())
    response['Content-Type'] = 'text/event-stream'
    return response


    浏览器端 javascript 代码:

    //调用上面这段服务器 stream_response ,日志显示在 data_container 的<div>里,stop_btn 是一个 button 按钮

    var source = new EventSource("{% url 'stream_response' %}");
    var container = document.getElementById('data_container');

    source.onmessage = function(event) {
    container.innerHTML += event.data + "<br>";
    };

    var stop_btn = document.getElementById('stop_btn');
    stop_btn.onclick = function() {
    source.close();
    };

    大致思路如上,代码没仔细调试过,你自己具体研究。
    noparking188
        5
    noparking188  
       2023-05-10 11:33:02 +08:00
    supervisor 呢
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5200 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 29ms · UTC 05:43 · PVG 13:43 · LAX 21:43 · JFK 00:43
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.