• Django 之admin源码


    复习单列,sql  orm

     

    不管用什么都是基于httpRespone

    url控制器,

    Django框架的设计模式借鉴了MVC框架的思想,也是分成三部分,来降低各个部分之间的耦合性。

    MTV  

      templates  view  models

    Model(模型):负责业务对象与数据库的对象(ORM)

           Template(模版):负责如何把页面展示给用户

           View(视图):负责业务逻辑,并在适当的时候调用Model和Template

    此外,Django还有一个urls分发器,它的作用是将一个个URL的页面请求分发给不同的view处理,view再调用相应的Model和Template

     

    2,AJAX

        ----------------contentType  上传文件指定False(编码格式)

    3 forms 组件    局部钩子,全局钩子

    4,cookie,session,

     Session

    1. 浏览器请求来了之后,服务端给你分配一个序号(口令)

     

    2. 浏览器收到响应之后,把得到的口令保存在 cookie

     

    3. 浏览器携带着刚才得到的口令,再次发送请求

     

    4. 服务端拿到口令,去后端根据口令找对应的数据(大字典

         session 依赖cookie  。cookie保存在浏览器,session保存在服务端

        session好处,客服端只有cookie的值,没有用户的信息

     

     

     

               request.sesion["name"]="egon"(走的流程)

             生成随机字符串

    看中间件:

     

    只是在内存中间,没有更新到数据库,如果没有return

     

    5,用户认证组件

    6,中间件:应用场景:限制访问的频率

     

    wsgiref 代替web服务器部署(把一堆字符串解析--》request(中间件))

    浏览器只解析,html  css   js(页面看到的东西不一定是服务器发来的)如果不加safe

     

    request发请求怎么到服务器?

    点击确定就

    ‘’

     post/index   HTTP/1.1

    ''''''''

    请求体里面怎么放name,password?

    服务器怎么解?

    必须按照一种格式解 (form有3种格式)

    Json

    form-data

    application/x-www-form-urlencoded(默认)

    ……所以我们在请求头告诉服务器用什么编码 content-Type=默认按这种解(form表单

    Name=yuan&pwd=123

     

    Ajax form表单一样的格式

    如果用ajaxjson格式 contentType

    要保证contentType  和内容换成一致

     

    下面一种是json格式

     

    不能骗浏览器,ajax里面要改成这样

    后端收到的为空,为什么?

     

    query对象里面有没有关键request.post只解析application/x-www-form-urlencoded

    只是不解析

    request.body 可以拿到所有原信息

    所以我们序列化

     

    补充:

    https://www.cnblogs.com/yuanchenqi/articles/9070966.html

    https://www.cnblogs.com/yuanchenqi/articles/8323452.html

    ‘’

     

    admin管理工具

        list_display = ["title","price","publishDate"](列表时,定制显示的列。)

        list_filter = ["publish","authors"]  (列表时,定制右侧快速筛选。)

        search_fields=["price","title"]      (列表时,模糊搜索的功能)

        search_field:添加搜索框

    https://www.cnblogs.com/yuanchenqi/articles/8323452.html  其他详见

    admin源码解析

    单例模式

    单例模式(Singleton Pattern)是一种常用的软件设计模式,该模式的主要目的是确保某一个类只有一个实例存在。当你希望在整个系统中,某个类只能出现一个实例时,单例对象就能派上用场。

    比如,某个服务器程序的配置信息存放在一个文件中,客户端通过一个 AppConfig 的类来读取配置文件的信息。如果在程序运行期间,有很多地方都需要使用配置文件的内容,也就是说,很多地方都需要创建 AppConfig 对象的实例,这就导致系统中存在多个 AppConfig 的实例对象,而这样会严重浪费内存资源,尤其是在配置文件内容很多的情况下。事实上,类似 AppConfig 这样的类,我们希望在程序运行期间只存在一个实例对象。

    Python 中,我们可以用多种方法来实现单例模式:

    • 使用模块
    • 使用 __new__
    • 使用装饰器(decorator)
    • 使用元类(metaclass)

    1)使用 __new__

    为了使类只能出现一个实例,我们可以使用 __new__ 来控制实例的创建过程,代码如下:

     

    class Singleton(object):
        _instance = None
        def __new__(cls, *args, **kw):
            if not cls._instance:
                cls._instance = super(Singleton, cls).__new__(cls, *args, **kw)  
            return cls._instance  

    class MyClass(Singleton):  
        a = 1

     

    在上面的代码中,我们将类的实例和一个类变量 _instance 关联起来,如果 cls._instance 为 None 则创建实例,否则直接返回 cls._instance。

    执行情况如下:

     

    >>> one = MyClass()
    >>> two = MyClass()
    >>> one == two
    True
    >>> one is two
    True
    >>> id(one), id(two)
    (4303862608, 4303862608)

     

    2)使用模块

    其实,Python 的模块就是天然的单例模式,因为模块在第一次导入时,会生成 .pyc 文件,当第二次导入时,就会直接加载 .pyc 文件,而不会再次执行模块代码。因此,我们只需把相关的函数和数据定义在一个模块中,就可以获得一个单例对象了。如果我们真的想要一个单例类,可以考虑这样做:

    # mysingleton.py
    class My_Singleton(object):
        def foo(self):
            pass
     
    my_singleton = My_Singleton()

    将上面的代码保存在文件 mysingleton.py 中,然后这样使用:

    from mysingleton import my_singleton
     
    my_singleton.foo()

     

     

    一个类只有一个实例对象

    只要有一个类,每一个类对象不一样,只有实例化对象地址才是一样的

    类的继承

    class Base(object):
        def __init__(self,val):
            self.val = val

    def func(self):
            self.test()
            print(self.val)

    def test(self):
            print("Base.test")

    class Foo(Base):
        def test(self):
            print("FOO.test")

    # def func(self):
        #     print(self.val,666)
        #有就执行自己的,没有就执行父类的
    class Bar(object):
        def __init__(self):
            self._register = {}

    def regiter(self,a,b=None):
            if not b:
                b=Base
            self._register[a] = b(a)  #函数,类,对象

    obj = Bar()  #实例化就会去执行它自己的__init__方法,并获取到一个对象b,b就可以调用里面的属性和方法了
    obj.regiter(1,Foo)
    obj.regiter(2)
    print(obj._register)  #{1: <__main__.Foo object at 0x0000000002213160>, 2: <__main__.Base object at 0x0000000002213198>}
    #obj._register[1] == Foo(1)
    obj._register[1].func()  #Foo的对象  打印结果:FOO.test       1
    obj._register[2].func()  #Base的对象  打印结果:Base.test     2

     

     

    单例模式:单例模式是一个设计模式,就是单个实例共用一个对象

    s1.py

    class Foo(object):
        def test(self):
            print("123")

    v = Foo()
    #v是Foo的实例

    s2.py

     

    from s1 import v as v1
    print(v1,id(v1))  #<s1.Foo object at 0x0000000002221710> 35788560

    from s1 import v as v2
    print(v1,id(v2))   #<s1.Foo object at 0x0000000002221710> 35788560

    # 两个的内存地址是一样的
    # 文件加载的时候,第一次导入后,再次导入时不会再重新加载。

     

    举例二:

    class Singleton:
        def __new__(cls, *args, **kw):
            '''__new__是一个构造方法,self就是他构造的'''
            if not hasattr(cls, '_instance'):
                orig = super(Singleton, cls)
                cls._instance = orig.__new__(cls, *args, **kw)
            return cls._instance

    one = Singleton()
    two = Singleton()
    print(one,two)   #他们两个的地址一样
    # print(id(one),id(two))
    one.name = 'alex'
    print(two.name)

    来自 <http://www.cnblogs.com/haiyan123/p/8034430.html>

     

     

    admin执行流程

    admin

        1 使用

    2 源码

      (1)启动

           执行每一个app下的admin.py 文件

       autodiscover_modules('admin', register_to=site)

      (2)注册

            class AdminSite(object):

         def __init__(self, name='admin'):

                           self._registry = {}

         def register(self, model_or_iterable, admin_class=None, **options):

          if not admin_class:

                                 admin_class = ModelAdmin   # 配置类

     

      self._registry[model] = admin_class(model, self)

      

      # {Book:BookConfig(Book),Publish:ModelAdmin(Publish)}

     

            site=AdminSite()

     

     

    ##########

     

    class BookConfig(ModelAdmin):

          list_display=["",]

     

    admin.site.register(Book,BookConfig)

     

    admin.site.register(Publish)

     

     

     

     {

     <class 'django.contrib.auth.models.Group'>: <django.contrib.auth.admin.GroupAdmin object at 0x00000256B97EF9E8>,

     <class 'django.contrib.auth.models.User'>: <django.contrib.auth.admin.UserAdmin object at 0x00000256B9825438>,

     <class 'app01.models.Book'>: <app01.admin.BookConfig object at 0x00000256B983C080>,

     <class 'app01.models.Publish'>: <app01.admin.PublishConfig object at 0x00000256B983C128>

     }

     

     

     

  • 相关阅读:
    Eureka 服务的注册和发现
    springcloud 中文文档
    mysql 7 种 join
    通用 mapper
    docker 容器操作( 以 tomcat 为例 )
    linux下安装phpunit简单方法
    图片优化的几个小工具
    安装基准测试工具sysbench
    安装pcntl以实现php多进程
    安装memcache及php的memcached模块
  • 原文地址:https://www.cnblogs.com/maojiang/p/9338243.html
Copyright © 2020-2023  润新知