Django 服务启动2次问题

首先,我们的操作如下:

一、命令行的启动服务:

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)中配置如下:

启动即可。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
为了启动Django服务,您可以选择两种方法:使用pycharm的Django服务或使用django-admin构建的项目。如果您选择使用pycharm的Django服务,可以按照以下步骤进行操作: 1. 在pycharm中打开您的Django项目。 2. 在顶部工具栏中找到并点击"Edit Configurations"按钮。 3. 在弹出的对话框中,选择"Python"配置。 4. 点击"+"按钮添加一个新的配置。 5. 在"Script path"字段中选择您的manage.py文件所在的路径。 6. 在"Parameters"字段中输入"runserver"。 7. 点击"OK"保存并关闭对话框。 8. 在顶部工具栏中选择您刚刚创建的配置。 9. 点击运行按钮来启动Django服务。 另外一种方法是使用django-admin构建的项目来启动服务。您可以按照以下步骤进行操作: 1. 打开命令行终端。 2. 导航至您的Django项目所在的目录。 3. 输入以下命令:django-admin runserver 4. 按下回车键来启动Django服务。 无论您选择哪种方法,一旦Django服务启动成功,您将能够在浏览器中访问您的应用程序。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [Django框架入门一使用pycharm与django-admin搭建环境并启动服务项目](https://blog.csdn.net/weixin_44232093/article/details/110388783)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值