• stark组件前戏之项目启动前加载指定文件


    1. django项目启动时, 自定制执行某个py文件

    dajngo 启动时。会将所有 路由加载到内存中。 我的目的就是在 路由加载之前,执行某个py文件。

    每个app中都有一个 apps.py

    from django.apps import AppConfig
    from django.utils.module_loading import autodiscover_modules

    class App02Config(AppConfig):
        name = 'app02'

        def ready(self):
            autodiscover_modules("xxxx") 这样django就会去, 已注册的app目录中。 寻找名称就叫 xxxx.py的文件, 并自动执行。
    这个操作,在任意的app中都可以。 根据代码要求,决定你是准备怎么搞。

    这样有一个小问题就是,回执行两次。 因为django 启动的时候。 会有两个线程启动。 一个是正常启动的,另一个是检测代码有没有改动, 改动了就重新启动一次

    所以, 在启动django的时候需要这样:

    在 Teminal 中:  python manage.py runserver 127.0.0.1:8001 --noreload   这样就只会执行一边了。 自动重启的py文件就不会运行了。

    提示:
      如果 xxxx.py 执行的代码向,  “某个地方”  放入了一些值(比如,在列表中append了数据), 之后的路由加载时, 就可以在  “某个地方” 读取到xxxx.py设置的值

    2. 单例模式

    永远实例化一个对象。

    python中。 一个类 class Foo(object): 这个类在进行实例化的时候。 每次实例化,都是一个单独的对象。  所以单独对某一个对象操作。 不会影响其他的对象。 这就是多例模式。

    这里一个知识点:
      python在 import 的时候。 首次导入会依次解释。 被导入模块中的代码。 并加载到内存。 如果再次导入这个模块的时候, python就不会再去 解释一遍这个.py文件。而是直接从内存中。取出已经解释过后的,代码。(并且无论在哪里进行的导入。只要导入过一次,后续的导入用的永远都是这一个东西)

    依靠这种机制, 我们就可以实现, 一个单例模式。

    可以理解为,我们使用导入的方式,设置了一个公共的变量。 我在1.py中,对这个变量进行赋值,更新。 那么 我在2.py中就能够, 接收到 更新之后的这个变量。
    唯一需要注意的就是, 更新的操作, 要在 读取的操作之前。 就可以了!

    就如图中所示。app.py 导入之后设置值。  而commons.py取出值。

    提示:
      如果以后存在一个单例模式的对象, 可以先在此对象中放入一个值。然后再在其他文件中导入该对象, 通过对象再次获取值。

    3. django路由分发的本质  include

     include 也是,一个通过字符串进行导入的东西。

    这是一部分的源码, 这里可以看出。  他先做了一个类型判断。  如果是字符串类型。 就使用 inmport_module() 进行导入。 并且又赋值给了他自己。
    然后最后进行返回。
    所以 返回的, 已经不是字符串了。 而是一个 module 对象。

        include函数主要返回有三个元素的元组。
        from django.conf.urls import url,include
        from app01 import urls
        urlpatterns = [
            url(r'^web/', (urls, app_name, namespace)), # 第一个参数是urls文件对象,通过此对象可以获取urls.patterns获取分发的路由。
        ]

     在源码内部,读取路由时:
      如果第一个参数有: urlspartterns 属性。那么子路由就从该属性中取出。
      如果第一个参数无: urlspartterns 属性。那么子路由就是他自己。

     

    所以根路由的  路由分发甚至可以这样干:

    form app01 inmport views
    urlpatterns = [ path('admin/', admin.site.urls), path("web/", ([ path("login/", views.login), path("logout/", views.logout), ], None, None)), ]
  • 相关阅读:
    死信队列消息原因排查
    MQ中间件死信队列深度不断增加问题解决案例
    DB2 57016报错的解决办法(表状态不正常,导致表无法操作)
    万门大学--童哲
    eclipse jvm配置
    weblogic threadpool has stuck threads
    8-10 ObserveableCommand演示
    8-9 四种执行方式区别讲解
    8-8 toObserve两种形态演示
    8-7 Observe两种形态演示
  • 原文地址:https://www.cnblogs.com/chengege/p/10732179.html
Copyright © 2020-2023  润新知