zoukankan      html  css  js  c++  java
  • 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__:

    基于模块的:

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

  • 相关阅读:
    yii 引入文件
    CodeForces 621C Wet Shark and Flowers
    面试题题解
    POJ 2251 Dungeon Master
    HDU 5935 Car(模拟)
    HDU 5938 Four Operations(暴力枚举)
    CodeForces 722C Destroying Array(并查集)
    HDU 5547 Sudoku(dfs)
    HDU 5583 Kingdom of Black and White(模拟)
    HDU 5512 Pagodas(等差数列)
  • 原文地址:https://www.cnblogs.com/klw1/p/11279822.html
Copyright © 2011-2022 走看看