day-72Django源码解析

settings源码

  用户配置了settings用用户的,没有配置用默认的

ENVIRONMENT_VARIABLE = "DJANGO_SETTINGS_MODULE"          #设置全局大字典

from django.conf import settings

class Settings(object):
    def __init__(self, settings_module):                 # BBS.settings
            
        for setting in dir(global_settings):             # 拿到global_settings文件里面所有的变量名
            if setting.isupper():  
                setattr(self, setting, getattr(global_settings, setting))
        self.SETTINGS_MODULE = settings_module

        mod = importlib.import_module(self.SETTINGS_MODULE)
        
        
         for setting in dir(mod):                       #  获取暴露给用户settings配置中的变量名
            if setting.isupper():
                setting_value = getattr(mod, setting)
                setattr(self, setting, setting_value)   # 利用字典的键存在与否 完成用户配置了用用户的,用户没配置用全局

    
class LazySettings(LazyObject):
     def _setup(self, name=None):
      
        settings_module = os.environ.get(ENVIRONMENT_VARIABLE)  # 从全局大字典os.environ中获取一个键为ENVIRONMENT_VARIABLE对应的值
        self._wrapped = Settings(settings_module)

settings = LazySettings()

admin启动源码

  django在启动的时候会依次执行每一个应用下的admin.py文件

from django.utils.module_loading import autodiscover_modules
autodiscover_modules('admin')

admin注册源码

class ModelAdmin(BaseModelAdmin):
        ...
        # 配置类
        
        
    class AdminSite(object):
        def __init__(self, name='admin'):
            self._registry = {}  
        def register(self, model, admin_class=None, **options):
            
            if not admin_class:
                admin_class = ModelAdmin
            
            self._registry[model] = admin_class(model)
    
    site = AdminSite()
        
    admin.py:
        admin.site.register(models.Publish)  # 仅仅是将注册了的模型表和以模型表为参数实例化产生的对象
                                             # 当做键值对存入了site对象中的_registry字段

django admin的使用

    1.在应用下注册你的模型表
    
    2.admin url的规律
        http://127.0.0.1:8000/admin/app01/book/                book表的查看
        http://127.0.0.1:8000/admin/app01/book/add/            book表的添加
        http://127.0.0.1:8000/admin/app01/book/3/change/        book表的编辑
        http://127.0.0.1:8000/admin/app01/book/3/delete/        book表的删除页面
        
        http://127.0.0.1:8000/admin/app01/publish/              publish表的查看
        http://127.0.0.1:8000/admin/app01/publish/add/          publish表的添加
        http://127.0.0.1:8000/admin/app01/publish/3/change/     publish表的编辑
        http://127.0.0.1:8000/admin/app01/publish/3/delete/     publish表的删除页面
    
        ps:
            1.admin会给每一个注册了的生成增删改查四条url
        
        
    3.五大关键性参数的功能

路由分发的本质

  url(r'^test/',([],None,None))

def get_urls(self):
        urlpatterns = [
            url(r'^$', wrap(self.index), name='index'),
            url(r'^login/$', self.login, name='login'),
            url(r'^logout/$', wrap(self.logout), name='logout'),
            url(r'^password_change/$', wrap(self.password_change, cacheable=True), name='password_change'),
            url(r'^password_change/done/$', wrap(self.password_change_done, cacheable=True),
                name='password_change_done'),
            url(r'^jsi18n/$', wrap(self.i18n_javascript, cacheable=True), name='jsi18n'),
            url(r'^r/(?P<content_type_id>\d+)/(?P<object_id>.+)/$', wrap(contenttype_views.shortcut),
                name='view_on_site'),
        ]
        return urlpatterns
    
    @property
    def urls(self):
        return self.get_urls(), 'admin', self.name
    
    
    
    
    一级分发
    url(r'^index/',([
            url(r'^test1/',test1),
            url(r'^test2/',test2),
                    ],None,None))
                    
    二级分发
        url(r'^index/',([
            url(r'^test1/',([
                    url(r'^test1_1/',test3),
                    url(r'^test1_2/',test4),
                    url(r'^test1_3/',test5),
                    url(r'^test1_4/',test6),
                            ],None,None)),
            url(r'^test2/',test2),
                    ],None,None))

单例模式

基于classmethod:

基于装饰器的:

基于元类__call__:

基于__new__:

基于模块的:

  模块的导入只会执行一次,所以实现了单例

猜你喜欢

转载自www.cnblogs.com/klw1/p/11279822.html