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

如何在Django停止runserver后自动登出所有用户

Django停止runserver时自动登出所有用户的解决办法

问题情况

我用Django搭建网站,采用内置用户模型,已经实现登录页面和登出按钮。现在希望停止runserver命令时,自动让所有已登录用户登出,尝试了以下代码但未生效:

试过的无效代码

myapp/signals.py

from django.contrib.auth import logout
from django.core.signals import request_finished
from django.dispatch import receiver

@receiver(request_finished)
def handle_server_shutdown(sender, **kwargs):
    logout()

myproject/init.py

import myapp.signals 

原有方案失效原因

  1. request_finished信号是每个HTTP请求处理完成后触发,和服务器关闭的场景完全无关,停止runserver时根本不会执行这个函数。
  2. logout()函数必须接收request参数才能正常工作,原有代码未传入请求对象,调用逻辑本身存在错误。

可行解决方案

方案1:清空所有Session(推荐)

Django的用户登录状态依赖Session存储,只要清空所有Session数据,所有用户下次访问时就会处于未登录状态。可以通过自定义runserver命令,在服务器退出时自动执行Session清理:

  1. 在你的app下创建management/commands目录(无则新建),新建custom_runserver.py文件:
from django.core.management.commands.runserver import Command as RunserverCommand
from django.contrib.sessions.models import Session
import atexit

class Command(RunserverCommand):
    def handle(self, *args, **options):
        # 注册服务器退出时执行的清理函数
        atexit.register(self.clear_all_sessions)
        super().handle(*args, **options)
    
    def clear_all_sessions(self):
        # 删除数据库中所有Session记录
        Session.objects.all().delete()
  1. 启动服务器时使用自定义命令:
python manage.py custom_runserver

方案2:生产环境退出信号监听(可选)

如果是生产环境使用uWSGI等服务器,可以通过监听进程退出信号来清理Session,但开发环境用runserver的话,方案1更直接高效。

注意事项

  • 清理Session会清除所有用户的登录状态,包括未过期的Session,确认这是你需要的行为再执行。
  • 若使用非数据库存储的Session(如Redis、本地文件),需对应修改清理逻辑,比如Redis需清空对应的Session键。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 11:30:24