所有的信号就是

  -使用框架预留的位置,帮助你自定义一些功能

Django的信号;flask的信号;scrapy的信号;

Django的信号:

Django中提供了“信号调度”,用于在框架执行操作时解耦。通俗来讲,就是一些动作发生的时候,信号允许特定的发送者去提醒一些接受者

Django内置信号

Model signals
    pre_init                    # django的modal执行其构造方法前,自动触发
    post_init                   # django的modal执行其构造方法后,自动触发
    pre_save                    # django的modal对象保存前,自动触发
    post_save                   # django的modal对象保存后,自动触发
    pre_delete                  # django的modal对象删除前,自动触发
    post_delete                 # django的modal对象删除后,自动触发
    m2m_changed                 # django的modal中使用m2m字段操作第三张表(add,remove,clear)前后,自动触发
    class_prepared              # 程序启动时,检测已注册的app中modal类,对于每一个类,自动触发
Management signals
    pre_migrate                 # 执行migrate命令前,自动触发
    post_migrate                # 执行migrate命令后,自动触发
Request/response signals
    request_started             # 请求到来前,自动触发
    request_finished            # 请求结束后,自动触发
    got_request_exception       # 请求异常后,自动触发
Test signals
    setting_changed             # 使用test测试修改配置文件时,自动触发
    template_rendered           # 使用test测试渲染模板时,自动触发
Database Wrappers
    connection_created          # 创建数据库连接时,自动触发

 

使用Djiango中的信号的时候就必须在启动项目之前把这些信号设置好;只有在Django中才有对数据库操作之前和之后的信号

因此要在项目的__init__.py文件中提前设置

#在写入数据库之前和之后做一些操作,用Django中的信息。
from django.db.models import signals

def before_save1(*args,**kwargs):
    print('有车来了,我要服务了--》',args,kwargs)

# def before_save2(*args,**kwargs):
#     print('有车来了,我要服务了--》',args,kwargs)

def after_save1(*args,**kwargs):
    print('有车来了,完事了--》',args,kwargs)

signals.pre_save.connect(before_save1)
# signals.pre_save.connect(before_save2)
signals.post_save.connect(after_save1)

  

flask的信号:

Flask框架中的信号基于blinker,其主要就是让开发者可是在flask请求过程中定制一些用户行为。所以使用前需要下载一下;

1. 内置信号

request_started = _signals.signal('request-started')                # 请求到来前执行
request_finished = _signals.signal('request-finished')              # 请求结束后执行

before_render_template = _signals.signal('before-render-template')  # 模板渲染前执行
template_rendered = _signals.signal('template-rendered')            # 模板渲染后执行

got_request_exception = _signals.signal('got-request-exception')    # 请求执行出现异常时执行

request_tearing_down = _signals.signal('request-tearing-down')      # 请求执行完毕后自动执行(无论成功与否)
appcontext_tearing_down = _signals.signal('appcontext-tearing-down')# 应用上下文执行完毕后自动执行(无论成功与否)

appcontext_pushed = _signals.signal('appcontext-pushed')            # 应用上下文push时执行
appcontext_popped = _signals.signal('appcontext-popped')            # 应用上下文pop时执行
message_flashed = _signals.signal('message-flashed')                # 调用flask在其中添加数据时,自动触发

源码示例和自定义信号(点击)

from flask import Flask,render_template
from flask import signals

app = Flask(__name__)

def x1(arg):
    print('x1')
def x2(arg):
    print('x2')

signals.request_started.connect(x1)
signals.request_started.connect(x2)


# @app.before_request
# def bf():
#     print('bbbbb')
#     return render_template("asdfadf")


@app.route('/index')
def func():
    print('视图函数')
    return "asdfasdf"


if __name__ == '__main__':
    # app.__call__
    app.run()
    # with app.app_context():
    #     pass

 

scrapy的信号;

			先写类:
				from scrapy import signals

				class MyExtend(object):
					def __init__(self):
						pass

					@classmethod
					def from_crawler(cls, crawler):
						self = cls()
                                               #注册信号
						crawler.signals.connect(self.x1, signal=signals.spider_opened)
						crawler.signals.connect(self.x2, signal=signals.spider_closed)

						return self

					def x1(self, spider):
						print('open')

					def x2(self, spider):
						print('close')

			配置:
				EXTENSIONS = {
					'xdb.ext.MyExtend':666,
				}

  

   

02-13 16:07