Django 服务启动2次问题

本文详细解析了Django服务启动的过程,从命令行参数解析到服务的运行,涵盖了环境变量设置、命令模块加载、参数处理及自动加载功能的实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

首先,我们的操作如下:

一、命令行的启动服务:

python manage.py runserver 0.0.0.0:8000

二、服务启动行为

    try:
        os.environ.setdefault("DJANGO_SETTINGS_MODULE", "demo27.settings")
        django.setup()
        from django.core.management import execute_from_command_line
        try:
            pass
        except ImportError:
            pass
        execute_from_command_line(sys.argv)
    except ImportError:
        pass

manage.py模块获取到命令行参数manage.py runserver 127.0.0.1:8000,然后将该参数交由execute_from_command_line方法处理。参数传递进行一系列的初始化

1.首先获取命令行第一个参数,也就是runserver,第0个参数是manage.py程序本身,同时把剩下的参数存入到options变量,
options=[0.0.0.0:8000'].

2.调用ManagementUtilityautocomplete检查系统环境变量是否设置了DJANGO_AUTO_COMPLETE。接着再调用ManagementUtility
fetch_command方法获取命令模块,该fetch_command通过调用get_commands方法将django.core.management.commands目录下所有
默认的命令模块获取,同时将settings里已注册的app目录INSTALLED_APPS下顺序反转,依次将app目录下对应的management/commands模块获取到。
这些模块都可以通过执行python manage.py 模块名调用。由于django.contrib.staticfilesapp下已经重写了runserver这个模块,所以默认
django.core.management.commands目录下的runserver模块会被后面查找到的模块覆盖掉.然后fetch_command再调用load_command_class
方法加载django.contrib.staticfiles.runserver模块,并将该模块的Command类实例化返回。

3.通过得到返回的runserver模块下的Command对象,继续调用对象的run_from_argv方法,将整个命令行参数传入该方法, run_from_argv
方法是基类django.core.management.base.BaseCommand的方法,如果要自定义manage.py的命令行参数模块,都必须实现该方法,或者可以直接
继承该基类,该方法默认会依次调用对象本身的create_parser,创建命令行参数解析器,然后继续调用execute执行一些系统检查,包括数据库连接同步,
可以通过改变对象的requires_system_checks属性为False则不进行该检查操作,requires_migrations_checks控制是否检查数据迁移计划行为.

4.做完应用检查后,再调用对象的handle方法,该方法由于对象本身没有重写,所有是继承父类django.core.management.commands.runserver.Command
handle方法,在该父类模块runserver中,为了保持程序向后兼容,所以将BaseRunserverCommand = Command,handle方法首先检查配置文件
是否为DEBUG模式,如果是,则检查是否配置了ALLOWED_HOSTS属性,然后检查命令行参数是否启用了ipv6,如果启用了,还得检查socket是否支持ipv6,
然后检查监听端口,默认端口8000handle方法会继续调用对象的run方法,该方法会检查命令行参数是否包含--noreload选项,如果包含则
不启用自动加载,由于命令行没有传入该选项,则使用默认行为,即:启用自动加载功能。

命令行选项参数如下:

--ipv6 # 默认为False,不使用IPV6

--nothreading # 默认值True,默认值为使用多线程,使用该选项后,则不使用线程,

--noreload # 默认值True 默认自动加载,使用该选项后,则不自动加载代码,用于代码文件有改动时会重新加载代码

--nostatic # 默认值True 默认处理指定STATIC_URL配置的静态文件服务,使用该选项后,将不处理页面加载后的静态文件的URL请求

--insecure # 默认值False 不允许在非DEBUG模式提供处理静态文件的服务,使用该选项后,即使DEBUG模式,也处理静态文件的请求

这样的行为,如果在默认的选项中,启动服务,我们的服务自然启动了两次,只是不在同一个线程里,你可以在主函数中做打印测试,

解决问题:

则不启用自动加载,输入命令行如下:

python manage.py 0.0.0.0:8000 --noreload

或者在IDE(Pycharm)中配置如下:

启动即可。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值