【问题标题】:Kill Django process from browser从浏览器中杀死 Django 进程
【发布时间】:2016-04-14 06:13:36
【问题描述】:

在 Django 视图中,我调用了一个用于上传和导入 excel 文件的函数。

def import_log(request):
    report = ""

    if request.method == "POST":
        file_object = request.FILES
        sheet_name = request.POST["sheet_name"]

        if len(file_object):
            file_object = file_object["file_object"]

        if len(file_object):
            process_import()

            context = {
                "report": report
            }

            return render(request, "import_log.html", context)

        else:
            return import_upload_view(request, error="No file uploaded")

当我尝试通过单击“停止加载此页面”或关闭浏览器来停止页面时,导入过程不会停止。

这些导入文件非常大,所以我希望能够在需要时从浏览器中终止进程。

我怎样才能做到这一点?

【问题讨论】:

  • 互联网不是这样运作的。
  • 您实际上可以使用线程或异步任务(使用 celery)来处理您的文件加载并在必要时将其终止。
  • @Anvesh - 什么?不,你不能。 Celery 是一个服务器端进程。您无法从浏览器中阻止它
  • @Sayse 你至少可以从浏览器中引发一个事件,我的意思是。

标签: python django http-post


【解决方案1】:

简单地说,你不能。

互联网通过向服务器发送请求然后等待响应来工作,它与进程的打开连接无关,这是服务器处理自己进程的工作。

浏览器本质上只不过是您的计算机监视器,显示发送给它的信息 - 因此您可以根据需要关闭监视器或拔掉插头,它不会阻止您的计算机运行

【讨论】:

    【解决方案2】:

    Django/server 唯一知道“中止连接”的时间是它试图发回响应时。要理解这一点,您可以编写一个虚拟视图并在该视图中休眠 10 秒;从浏览器调用它并尽快停止它;等着看 Django 做了什么。如果您正在运行 Django Dev 服务器,那么您应该清楚 Django 的行为正常并发送响应,但是由于连接中止而发生 500 错误,然后尝试将此 500 错误发送到客户端,这当然也显然失败了。

    所以,中途停止查看进程是不可能的。

    但是,您可以通过首先将请求发送到您的视图然后分拆一个新流程来执行“相当大”的导入流程来改变您解决此问题的方式;通过在某些持久数据存储(可能在数据库中)中使用某些唯一 ID 和当前时间戳来注册进程;返回 HTTP 状态码 202(Accepted) 和注册的 ID 以结束视图。

    在纺纱过程中,有多线程。一个线程不断地轮询数据库以检查当前时间与数据库中的时间之间的增量。如果差异超过您决定的阈值(例如 10 秒),则整个过程应该会自行终止。

    从浏览器继续使用 AJAX 访问 API(另一个 Django 视图)来更新数据库中特定记录的时间戳,该记录的 ID 是您在 202 响应中获得的 ID。

    这个想法是让服务器知道客户端仍然可用,如果由于某种原因您没有看到来自客户端的任何 ping,您会将其视为浏览器关闭或导航离开页面的情况,因此停止处理分拆出来的流程。

    如果您是单页应用程序,这种方法可能会变得棘手。

    【讨论】:

    • 我没有在我的回答中包含这一点,因为向用户公开一种方法来提供需要杀死的进程的 ID 是一个巨大的安全漏洞
    • @Sayse 我的建议是不要公开操作系统给出的进程ID,而是使用客户端和服务器都知道的任何随机数。
    猜你喜欢
    • 1970-01-01
    • 2020-01-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-08
    相关资源
    最近更新 更多