用Django全栈开发(进阶篇)——08. 浅聊Django初始化以及回调

本文详细解析了Django的启动流程,包括十二个步骤,从命令行启动到最终的WSGI服务。同时深入讨论了Django初始化回调机制,介绍了如何在App中配置和实现`ready()`方法,以及解决初始化回调重复执行的问题。通过本文,读者可以更好地理解Django的内部工作原理。
摘要由CSDN通过智能技术生成

大家好,这是皮爷给大家带来的最新的学习Python能干啥?之Django教程的进阶版

在之前《用Django全栈开发》系列专辑里面,皮爷详细的阐述了如何编写一个完整的网站,具体效果可以在源码里面查看。

从进阶篇开始,每一篇文章都是干货满满,干的不行。这一节,我们来说:Django的初始化启动。

Peekpa.com的官方地址:http://peekpa.com

获取整套教程源码唯一途径,关注『皮爷撸码』,回复『peekpa.com』

皮爷的每一篇文章,都配置相对应的代码。这篇文章的代码对应的Tag是“Advanced_08”。

在这里插入图片描述

Django启动流程

众所周知,如果要启动一个Django项目,我们使用的命令是:

$ python manage.py runserver <xx.xx.xx.xx:xx>

命令后面的尖括号里面的内容,是选择性填写的。其实,最关键的就是runserver这个命令。

这个命令是在manage.py里面。

所以,我们来到项目目录下的manage.py文件里,看到:

if __name__ == '__main__':
    os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'Peekpa.settings')
    try:
        from django.core.management import execute_from_command_line
    except ImportError as exc:
        raise ImportError(
            "Couldn't import Django. Are you sure it's installed and "
            "available on your PYTHONPATH environment variable? Did you "
            "forget to activate a virtual environment?"
        ) from exc
    execute_from_command_line(sys.argv)   # 这里运行

最关键的是最后一句:

execute_from_command_line(sys.argv)   # 这里运行
步骤一

然后点进去我们看源码:

def execute_from_command_line(argv=None):
    """Run a ManagementUtility."""
    utility = ManagementUtility(argv)
    utility.execute()

这里其实是初始化了一个实例,然后调用了execute()方法。

这个方法其实挺长的,在django.core.management.__init__文件里。

步骤二

这个execute()方法里面,最重要的是以下方法:

def execute(self):
    ....内容太多忽略....
    django.setup()
    ....内容太多忽略....
步骤三

在上面的这个django.setup()方法中,代码就会调用下面这个方法:

def setup(set_prefix=True):
    ....内容太多忽略....
    apps.populate(settings.INSTALLED_APPS)

可以看到,在这个里面,最终调用的是apps.populate(),而括号里面的内容,正式我们settings.py里面的INSTALLED_APPS那个列表。进去这个方法我们看到,这个方法超级长,但是有三处重点:

def populate(self, installed_apps=None):
    """
    Load application configurations and models.

    Import each application module and then each model module.

    It is thread-safe and idempotent, but not reentrant.
    """
    
    ....内容太多忽略....
    
    # Phase 1: initialize app configs and import app modules.
    ....内容太多忽略....
    # 创建实例
    app_config = AppConfig.create(entry
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值