所有的信号就是
-使用框架预留的位置,帮助你自定义一些功能。
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, }