首先,我们的操作如下:
一、命令行的启动服务:
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.调用ManagementUtility
的autocomplete
检查系统环境变量是否设置了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.staticfiles
app下已经重写了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,
然后检查监听端口,默认端口8000,handle
方法会继续调用对象的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)中配置如下:
启动即可。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)