Django 소스 읽기 (2) INSTALLEDAPPS 로드 프로세스

15976 단어 Django 소스 읽기
4
  • 다시 상절에서 처음 시작한 excute 함수로 돌아가서django를 분석해 봅시다.setup () 함수, 그 안에 어떻게 불러오는 설정을 하는지 보십시오
  • # django\core\management\__init__.py
    def execute(self):
        ...
        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()
        ...
    

    django.setup() 이니시에이터
    이 코드는django/init.py중
    def setup(set_prefix=True):
        """
        Configure the settings (this happens as a side effect of accessing the
        first setting), configure logging and populate the app registry.
        Set the thread-local urlresolvers script prefix if `set_prefix` is True.
        """
        ...
        configure_logging(settings.LOGGING_CONFIG, settings.LOGGING)
        if set_prefix:
            set_script_prefix(
                '/' if settings.FORCE_SCRIPT_NAME is None else settings.FORCE_SCRIPT_NAME
            )
        apps.populate(settings.INSTALLED_APPS)
    
  • configure_logging 구성 로그 정보, setscript_prefix 접두사를 설정하여 완전함을 보충합니다. 이 두 가지 방법은 직접적으로 넘어갑니다.우리는 다음과 같은 가치 있는 코드를 보았는데, 모듈from django를 호출한 것이다.apps import apps의 클래스 방법 populate,settings를 불러옵니다.INSTALLED_APPS의 사용자 정의 app(문자열) 및 해당 모델 모듈을 django에 저장합니다.apps에서 이것은 전역적인 Apps 클래스입니다. (이 클래스는django.apps.registry에서 정의되고 populate(self,installed apps=None)가 주요 방법입니다.)실례.이미 설치된 응용 프로그램의 등록표입니다. 이 등록표는 설정 정보를 저장하고 자성하는 동시에 이 모델의 목록을 유지합니다

  • 모형의 로드
        def populate(self, installed_apps=None):
            # populate() might be called by two threads in parallel on servers
            # that create threads before initializing the WSGI callable.
            with self._lock:
                ...
                for entry in installed_apps:
                    if isinstance(entry, AppConfig):
                        app_config = entry
                    else:
                        app_config = AppConfig.create(entry)
                    ...
                    self.app_configs[app_config.label] = app_config
                    app_config.apps = self
                ...
    

    4
  • populate 함수 with를 통해self. 오픈lock = threading.Lock () 자물쇠, 그래서 라인이 안전합니다. 그리고 설치 로드를 순환합니다.apps, AppConfig 실례 형식이면 되돌아오고 그렇지 않으면 app를 불러오고 이 app의 클래스 대상 appconfig = AppConfig.create(entry),self에 저장.app_configs에서.

  • 4
  • create 방법은classmethod입니다. 이것은 공장 모델입니다. 이것은 파라미터에 따라 AppConfig(app name, app module)과 같은 실례를 구성합니다
  •         try:
                app_name = cls.name
            except AttributeError:
                raise ImproperlyConfigured(
                    "'%s' must supply a name attribute." % entry)
    
            # Ensure app_name points to a valid module.
            try:
                app_module = import_module(app_name)
    

    4
  • 그중 appname은 INSTALLED 를 나타냅니다.APPS에 지정된 응용 문자열, appmodule 표시는 app에 따라name이 로드된 module입니다.AppConfig 인스턴스를 초기화하는 방법에는 이러한 적용된 태그, 파일 경로 등의 정보가 기록되며, 이러한 인스턴스는 해당 속성에 저장됩니다
  •             # Phase 2: import models modules.
                for app_config in self.app_configs.values():
                #       ,      app  
                    app_config.import_models()
    
                self.clear_cache()
    
                self.models_ready = True
    
                # Phase 3: run ready() methods of app configs.
                for app_config in self.get_app_configs():
                #        
                    app_config.ready()
    
                self.ready = True
                self.ready_event.set()
                
    #   self.get_app_configs()
    odict_values([<AdminConfig: admin>, 
    <AuthConfig: auth>, 
    <ContentTypesConfig: contenttypes>, 
    <SessionsConfig: sessions>, 
    <MessagesConfig: messages>,
    ...
    <AppConfig: pure_pagination>])
    
    #   import_models      self.models_module
    <module 'django.contrib.admin.models' from 'C:\\mooc_project\\lib\\site-packages\\django\\contrib\\admin\\models.py'>
    <module 'django.contrib.auth.models' from 'C:\\mooc_project\\lib\\site-packages\\django\\contrib\\auth\\models.py'>
    <module 'django.contrib.contenttypes.models' from 'C:\\mooc_project\\lib\\site-packages\\django\\contrib\\contenttypes\\models.py'>
    <module 'django.contrib.sessions.models' from 'C:\\mooc_project\\lib\\site-packages\\django\\contrib\\sessions\\models.py'>
    #         ,self.models                    。
    

    좋은 웹페이지 즐겨찾기