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

时间:2021-12-11 22:03:59

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中就能够, 接收到 更新之后的这个变量。
唯一需要注意的就是, 更新的操作, 要在 读取的操作之前。 就可以了!

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

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

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

3. django路由分发的本质  include

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

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

这是一部分的源码, 这里可以看出。  他先做了一个类型判断。  如果是字符串类型。 就使用 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 属性。那么子路由就是他自己。

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

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

form app01 inmport views
urlpatterns = [ path('admin/', admin.site.urls), path("web/", ([ path("login/", views.login), path("logout/", views.logout), ], None, None)), ]