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


    所有的信号就是

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

    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,
    				}
                
    

      

       

  • 相关阅读:
    Servlet梳理一
    String和StringBuffer的区别
    谈谈面对将要来到的第一份工作
    shell grep文本搜索
    Shell cut分割
    python的学习之路:计算
    web端和手机端测试有什么不同
    让TortoiseGit记住帐号密码方法
    操纵IE,模拟用户登录
    MVC路由配置.html不能识别
  • 原文地址:https://www.cnblogs.com/zenghui-python/p/11654864.html
Copyright © 2020-2023  润新知