You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

关闭浏览器标签页时自动关闭Django服务器(CMD)的问题求助

Let's break down the issues with your current approach and fix them step by step:

1. AJAX Request Pitfalls (Async & CSRF)

Your AJAX call has two critical problems:

  • Asynchronous execution: By default, $.ajax runs asynchronously. When the browser tab closes, it may terminate the request before it reaches your Django server. You need to set async: false to force the request to complete before the page unloads.
  • Missing CSRF token: Django blocks POST requests without a valid CSRF token, which explains why your closeui view is never hit. You need to include the token in your AJAX headers.

Fixed JavaScript code:

{% block js %}
<script>
window.onbeforeunload = function() {
    // Grab Django's CSRF token from the page
    const csrfToken = document.querySelector('[name=csrfmiddlewaretoken]').value;
    
    $.ajax({
        type: "POST",
        url: "{% url 'closeui' %}", // Use Django's url tag for reliability
        async: false, // Critical: ensures request finishes before tab closes
        headers: {
            'X-CSRFToken': csrfToken
        },
        success: function() {
            console.log('Shutdown signal sent to server');
        },
        error: function() {
            console.log('Failed to send shutdown request');
        }
    });

    // Note: Modern browsers ignore custom text here, this just triggers a close confirmation prompt
    return "Are you sure you want to close?";
};
</script>
{% endblock js %}

2. Invalid Django View Structure

Your closeui function isn't a valid Django view:

  • It doesn't accept a request parameter (required for all Django views).
  • It doesn't return an HttpResponse (Django will throw a 500 error without this).

Fixed view code:

from django.http import HttpResponse
import os
from win32com.client import GetObject

def closeui(request):
    # Only process POST requests
    if request.method != 'POST':
        return HttpResponse("Invalid request method", status=405)

    WMI = GetObject('winmgmts:')
    # Target ONLY the CMD process running Django's runserver (not all CMD windows!)
    for p in WMI.ExecQuery('select * from Win32_Process where Name="cmd.exe"'):
        cmd_line = p.Properties_('CommandLine').Value
        # Check if the command line includes Django's runserver command
        if cmd_line and 'runserver' in cmd_line:
            pid = p.Properties_('ProcessId').Value
            print(f"Killing Django server PID: {pid}")
            os.system(f"taskkill /pid {pid} /f") # /f forces termination

    return HttpResponse("Shutdown request processed")

3. Route Configuration

Make sure your route uses the name parameter so the {% url %} tag works correctly:

# urls.py
from django.urls import path
from . import views

urlpatterns = [
    # Your other routes...
    path('closeui/', views.closeui, name='closeui'),
]

Key Notes to Keep in Mind

  • Browser limitations: Some browsers (especially in private/incognito mode) may block synchronous AJAX during page unload, so this isn't 100% reliable.
  • Production warning: This approach is only suitable for local development. In production, use a process manager like Supervisor or systemd to manage your Django server—never rely on frontend triggers to shut down services.
  • Dependency check: Ensure you have the pywin32 library installed (pip install pywin32) for the WMI functionality to work.

内容的提问来源于stack exchange,提问作者frank hk

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 04:47:36