django的 信号详解编程语言

django的 信号详解编程语言

1、信号,其实就是钩子,可以在上面几种情况下定义执行某个函数,我们一般在project的__init__文件中定义,下面就是一个例子

django的 信号详解编程语言

2、用到模块需要导入,分别在下面的几个路径中

from django.core.signals import request_finished 
from django.core.signals import request_started 
from django.core.signals import got_request_exception 
 
 
from django.db.models.signals import class_prepared 
from django.db.models.signals import pre_init 
from django.db.models.signals import post_init 
 
 
from django.db.models.signals import pre_save 
from django.db.models.signals import post_save 
 
 
from django.db.models.signals import pre_delete 
from django.db.models.signals import post_delete 
 
from django.db.models.signals import m2m_changed 
from django.db.models.signals import pre_migrate 
from django.db.models.signals import post_migrate 
 
from django.test.signals import setting_changed 
from django.test.signals import template_rendered 
 
from django.db.backends.signals import connection_created 

  

3、下面就是一个使用的例子,把函数注册到信号中

# 1、定义执行的函数 
def callback1(sender,**kwargs): 
    print("before pre_migrate") 
    print(sender,kwargs) 
 
 
 
# 定义执行的函数 
def callback2(sender,**kwargs): 
    print("after pre_migrate") 
    print(sender,kwargs) 
 
 
# 在执行migrate之前会执行的函数 
pre_migrate.connect(callback1) 
 
 
# 在执行migrate之后执行的函数 
post_migrate.connect(callback2) 

  

4、下面我们执行migrate命令就会有下面提示

E:/python/django_last>python manage.py migrate 
Operations to perform: 
  Apply all migrations: admin, app1, auth, contenttypes, sessions 
before pre_migrate 
<AdminConfig: admin> {'signal': <django.dispatch.dispatcher.Signal object at 0x01C755D0>, 'app_config': <AdminConfig: admin>, 'verbosity': 1, 'interactive': True, 'using': 'default', 'apps': <django.db.migrations 
.state.StateApps object at 0x02CF1130>, 'plan': []} 
before pre_migrate 
<AuthConfig: auth> {'signal': <django.dispatch.dispatcher.Signal object at 0x01C755D0>, 'app_config': <AuthConfig: auth>, 'verbosity': 1, 'interactive': True, 'using': 'default', 'apps': <django.db.migrations.sta 
te.StateApps object at 0x02CF1130>, 'plan': []} 
before pre_migrate 
<ContentTypesConfig: contenttypes> {'signal': <django.dispatch.dispatcher.Signal object at 0x01C755D0>, 'app_config': <ContentTypesConfig: contenttypes>, 'verbosity': 1, 'interactive': True, 'using': 'default', ' 
apps': <django.db.migrations.state.StateApps object at 0x02CF1130>, 'plan': []} 
before pre_migrate 
<SessionsConfig: sessions> {'signal': <django.dispatch.dispatcher.Signal object at 0x01C755D0>, 'app_config': <SessionsConfig: sessions>, 'verbosity': 1, 'interactive': True, 'using': 'default', 'apps': <django.d 
b.migrations.state.StateApps object at 0x02CF1130>, 'plan': []} 
before pre_migrate 
<App1Config: app1> {'signal': <django.dispatch.dispatcher.Signal object at 0x01C755D0>, 'app_config': <App1Config: app1>, 'verbosity': 1, 'interactive': True, 'using': 'default', 'apps': <django.db.migrations.sta 
te.StateApps object at 0x02CF1130>, 'plan': []} 
Running migrations: 
  No migrations to apply. 
after pre_migrate 
<AdminConfig: admin> {'signal': <django.dispatch.dispatcher.Signal object at 0x01C75610>, 'app_config': <AdminConfig: admin>, 'verbosity': 1, 'interactive': True, 'using': 'default', 'apps': <django.db.migrations 
.state.StateApps object at 0x03183FD0>, 'plan': []} 
after pre_migrate 
<AuthConfig: auth> {'signal': <django.dispatch.dispatcher.Signal object at 0x01C75610>, 'app_config': <AuthConfig: auth>, 'verbosity': 1, 'interactive': True, 'using': 'default', 'apps': <django.db.migrations.sta 
te.StateApps object at 0x03183FD0>, 'plan': []} 
after pre_migrate 
<ContentTypesConfig: contenttypes> {'signal': <django.dispatch.dispatcher.Signal object at 0x01C75610>, 'app_config': <ContentTypesConfig: contenttypes>, 'verbosity': 1, 'interactive': True, 'using': 'default', ' 
apps': <django.db.migrations.state.StateApps object at 0x03183FD0>, 'plan': []} 
after pre_migrate 
<SessionsConfig: sessions> {'signal': <django.dispatch.dispatcher.Signal object at 0x01C75610>, 'app_config': <SessionsConfig: sessions>, 'verbosity': 1, 'interactive': True, 'using': 'default', 'apps': <django.d 
b.migrations.state.StateApps object at 0x03183FD0>, 'plan': []} 
after pre_migrate 
<App1Config: app1> {'signal': <django.dispatch.dispatcher.Signal object at 0x01C75610>, 'app_config': <App1Config: app1>, 'verbosity': 1, 'interactive': True, 'using': 'default', 'apps': <django.db.migrations.sta 
te.StateApps object at 0x03183FD0>, 'plan': []} 
 
E:/python/django_last> 

  

上面是python给我们定义的信号,我们还可以自定义信号,下面说一下如何自定义信号,也是写在projec的__init__文件中

1、注册我们的信号,和信号的里的函数

# 1、导入模块 
import django.dispatch 
 
 
# 2、注册一个信号 
test = django.dispatch.Signal(providing_args=["aa","bb"]) 
 
# 这里的aa和bb相当于形参 
 
 
 
# 3、定义一个触发信号要执行的函数 
def callback3(sender,**kwargs): 
    print("自定义信号") 
    print(sender,kwargs) 
 
 
# 4、给信号注册一个函数 
test.connect(callback3) 

  

2、在函数使用自定义的信号

# 使用我们自定义的信号 
def cus_signal(request): 
 
    # 导入自定义的信号,这里需要注意,导入__init__下的信号,直接用下面的方式就可以了 
    from django_last import test 
 
    # 触发信号,这里要记得要传参数,sender的意思是 谁发送的信号 
    test.send(sender="自定义信号",aa="django",bb="python") 
    return HttpResponse("自定义信号") 

  

3、效果如下

django的 信号详解编程语言

 无论是django定义的信号,还是我们自定义的信号,我们就可以为一个信号注册多个函数,这些多个函数会按照注册的顺序执行

原创文章,作者:ItWorker,如若转载,请注明出处:https://blog.ytso.com/20811.html

(0)
上一篇 2021年7月19日
下一篇 2021年7月19日

相关推荐

发表回复

登录后才能评论