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