Django如何启动源码分析

Django如何启动源码分析

启动

我们启动Django是通过python manage.py runsever的命令

解决

这句话就是执行manage.py文件,并在命令行发送一个runsever字符串

解析manage.py

#!/usr/bin/env python
import os
import sys

if __name__ == "__main__":
    #os.environ.setdefault 方法可以修改系统环境变量,但是只能os.environ 只能影响到当前运行程序
    os.environ.setdefault("DJANGO_SETTINGS_MODULE", "zx2.settings")
    try:
        #导入模块,其实这里不单单只是导入execute_from_command_line这个方法,更多的是检查Django的模块,配置是否有问题
        from django.core.management import execute_from_command_line
    except ImportError:
        # The above import may fail for some other reason. Ensure that the
        # issue is really that Django is missing to avoid masking other
        # exceptions on Python 2.
        try:
            #精准判断是不是django模块的问题
            import django
        except ImportError:
            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?"
            )
        raise
    #sys.argv是从外部获取参数,最后执行下面这个方法
    execute_from_command_line(sys.argv)

测试sys.argv

发现两种启动获取的参数不一样,但是第二个参数一样

命令行启动项目
['manage.py', 'runserver']

pycharm 启动项目
['C:/Users/Administrator/Desktop/01python/django/zx1/manage.py', 'runserver', '127.0.0.1:8000']

解析execute_from_command_line(sys.argv)

项目启动入口

def execute_from_command_line(argv=None):
    """
    管理应用程序的简单方法
    A simple method that runs a ManagementUtility.
    """
    utility = ManagementUtility(argv)
    utility.execute()

ManagementUtility初始化代码

class ManagementUtility(object):
    """
    封装django-admin 和 manage.py的公共逻辑代码
    Encapsulates the logic of the django-admin and manage.py utilities.
    """
    def __init__(self, argv=None):
        #把argv给self对象
        self.argv = argv or sys.argv[:]
        #返回path最后的文件名。若path以/或\结尾,那么就会返回空值,为zx1
        self.prog_name = os.path.basename(self.argv[0])
        self.settings_exception = None

utility.execute()分析

    def execute(self):
        """
        给定命令行参数,这将确定哪个子命令将要被运行,创建一个适合该命令的解析器,并运行它。
        Given the command-line arguments, this figures out which subcommand is
        being run, creates a parser appropriate to that command, and runs it.
        """
        try:
            #self.argv[1]值为runserver
            subcommand = self.argv[1]
        except IndexError:
            subcommand = 'help'  # Display help if no arguments were given.
        #预处理选项以提取--settings和--pythonpath。
        # Preprocess options to extract --settings and --pythonpath.
        #这些选项可能会影响可用的命令,因此
        # These options could affect the commands that are available, so they
        #必须提前处理。
        # must be processed early.
        #创建一个命令分析器
        parser = CommandParser(None, usage="%(prog)s subcommand [options] [args]", add_help=False)
        parser.add_argument('--settings')
        parser.add_argument('--pythonpath')
        parser.add_argument('args', nargs='*')  # catch-all
        try:
            #self.argv[2:]值为'127.0.0.1:8000',可以推断出这部分可能和启动服务器有关,并且有默认的ip和端口号
            options, args = parser.parse_known_args(self.argv[2:])
            handle_default_options(options)
        except CommandError:
            pass  # Ignore any option errors at this point.

        try:
        #获取app配置信息
            settings.INSTALLED_APPS
        except ImproperlyConfigured as exc:
            self.settings_exception = exc

        if settings.configured:
            # Start the auto-reloading dev server even if the code is broken.
            # The hardcoded condition is a code smell but we can't rely on a
            # flag on the command class because we haven't located it yet.
            #判断外部输入命令,这部分就是启动的核心代码了
            if subcommand == 'runserver' and '--noreload' not in self.argv:
                try:
                    autoreload.check_errors(django.setup)()
                except Exception:
                    # The exception will be raised later in the child process
                    # started by the autoreloader. Pretend it didn't happen by
                    # loading an empty list of applications.
                    apps.all_models = defaultdict(OrderedDict)
                    apps.app_configs = OrderedDict()
                    apps.apps_ready = apps.models_ready = apps.ready = True

                    # Remove options not compatible with the built-in runserver
                    # (e.g. options for the contrib.staticfiles' runserver).
                    # Changes here require manually testing as described in
                    # #27522.
                    _parser = self.fetch_command('runserver').create_parser('django', 'runserver')
                    _options, _args = _parser.parse_known_args(self.argv[2:])
                    for _arg in _args:
                        self.argv.remove(_arg)

            # In all other cases, django.setup() is required to succeed.
            else:
                django.setup()

        self.autocomplete()

        if subcommand == 'help':
            if '--commands' in args:
                sys.stdout.write(self.main_help_text(commands_only=True) + '\n')
            elif len(options.args) < 1:
                sys.stdout.write(self.main_help_text() + '\n')
            else:
                self.fetch_command(options.args[0]).print_help(self.prog_name, options.args[0])
        # Special-cases: We want 'django-admin --version' and
        # 'django-admin --help' to work, for backwards compatibility.
        elif subcommand == 'version' or self.argv[1:] == ['--version']:
            sys.stdout.write(django.get_version() + '\n')
        elif self.argv[1:] in (['--help'], ['-h']):
            sys.stdout.write(self.main_help_text() + '\n')
        else:
            self.fetch_command(subcommand).run_from_argv(self.argv)

后续代码有点看的迷糊了,没有找到socket启动的部分,以后再来

原文地址:https://www.cnblogs.com/zx125/p/11745863.html

时间: 2024-11-08 18:29:23

Django如何启动源码分析的相关文章

Django搭建及源码分析(三)---+uWSGI+nginx

每个框架或者应用都是为了解决某些问题才出现旦生的,没有一个事物是可以解决所有问题的.如果觉得某个框架或者应用使用很不方便,那么很有可能就是你没有将其使用到正确的地方,没有按开发者的设计初衷来使用它,当你将一个框架的优势使用到极致时一定是非常舒服和顺手的一件事.但同时也有可能衍生另一个问题,这个框架只解决了你的问题一,没有解决问题二.三等等,因此,就出现了多个框架/应用相结合的情况.比如Django + uWSGI + nginx. 本人初学python,找了一些实例进行了一些操作,以下纯属目前的

Android之rild进程启动源码分析

Android 电话系统框架介绍 在android系统中rild运行在AP上,AP上的应用通过rild发送AT指令给BP,BP接收到信息后又通过rild传送给AP.AP与BP之间有两种通信方式: 1.Solicited Response:Ap向Bp发送请求,Bp给Ap发送回复,该类型的AT指令及其回调函数以数组的形式存放在Ril_commands.h文件中: {数组中的索引号,请求回调函数,响应回调函数} [plain] view plaincopy {0, NULL, NULL},      

Openstack学习笔记之——Neutron-server服务加载与启动源码分析(三)

本文是在学习Openstack的过程中整理和总结,由于时间和个人能力有限,错误之处在所难免,欢迎指正! 在Neutron-server服务加载与启动源码分析(二)中搞定模块功能的扩展和加载,我们就回到Neutron-server服务加载与启动源码分析(一)中的_run_wsgi函数 <span style="font-size:14px;">def _run_wsgi(app_name): app = config.load_paste_app(app_name) ifno

Django rest framework源码分析(一) 认证

一.基础 最近正好有机会去写一些可视化的东西,就想着前后端分离,想使用django rest framework写一些,顺便复习一下django rest framework的知识,只是顺便哦,好吧.我承认我是故意的,因为我始终觉得,如果好的技术服务于企业,顺便的提高一下自己.大家都很开心不是不.再次强调一下,真的只是顺便. 安装吧 pip install djangorestframework 1.2.需要先了解的一些知识 理解下面两个知识点非常重要,django-rest-framework

Django框架 --CBV源码分析、restful规范、restframework框架

一.CBV源码分析 1.url层的使用CBV from app01 import views url(r'book/',views.Book.as_view()) 2.as_view方法 as_view是一个类方法,实际上是一个闭包函数(内层函数包含对外层作用域的使用) 请求来了以后,调用as_view方法,调用函数中的view方法,view方法是调用了dispatch方法 @classonlymethod def as_view(cls, **initkwargs): def view(req

Django 之restfromwork 源码分析之--视图组件

restframework 源码分析以及使用 mixins 中的五种类方法 from rest_framework import mixins # mixins 中一种有五种类 # 第一种:用户保存数据 class CreateModelMixin(object): """ Create a model instance. """ def create(self, request, *args, **kwargs): # 序列化的类的对象 ser

django中CBV源码分析

前言:Django的视图处理方式有两种: FBV(function base views) 是在视图里基于函数形式处理请求. CBV(class base views)是在视图里基于类的形式处理请求. Python是一个面向对象的编程语言,如果只用函数来开发,有很多面向对象的优点就错失了(继承.封装.多态).所以Django在后来加入了Class-Based-View.可以让我们用类写View.这样做的优点主要下面两种: 提高了代码的复用性,可以使用面向对象的技术,比如Mixin(多继承) 可以

Django搭建及源码分析(二)

本节从由Django生成的manage.py开始,分析Django源码.python版本2.6,Django版本1.6.11. manage.py代码很简单. #!/usr/bin/env python import os import sys if __name__ == "__main__": os.environ.setdefault("DJANGO_SETTINGS_MODULE", "MyDjProj.settings") from d

Django搭建及源码分析(一)

一.关于Django以下两个站点,在使用方面有详细说明. http://www.nowamagic.net/academy/part/13/286 http://www.w3cschool.cc/django/django-tutorial.html 以下是在centos6.0最小系统下,搭建Django的过程,默认Python版本2.6 二.安装Django 1.下载源码使用python setup.py install安装,下载时选择与python环境相兼容的版本.很多高版本的Django不