Django中的信号简介

Django中的信号

在现实中,我们会遇到各种各样的需求,比如对客户端请求进行过滤,将满足某些条件的客户端请求过滤掉,此时,我们可以利用Django的中间件来实现该需求,或者,我们希望每次model的save()方法被调用前后,都要写一条日志到日志文件中,此时,我们可以通过Django提供的内置信号post_save来实现,本文我们将要介绍Django的高级功能信号。

信号的概念

简单点说,Django框架内部包含了一个信号调度器,它的作用是可以将框架内部发生的任何操作都通知到功能独立的应用程序,当然,我们也可以缩小发送者和接收者的范围,即指定具体的发送者和接受者,假设我们的程序中有多个业务逻辑都在等待某一个事件发生之后再继续执行后面的代码,那么此时,信号是非常有用的。

使用场景介绍

开始深入研究信号之前,我们先假设这样一种场景:某web站点使用Django开发,现在有一个需求是这样的,每次,当一个客户端请求到来之前和结束之后,都要执行一个函数,这个函数会打印一条Request finished!的消息,我们可以怎么做呢?一种方法是定义一个装饰器,如下代码所示:
from django.shortcuts import render, HttpResponse

# create your views here

def request_finished():
print(“Request finished!”)

def outer(func):
def wrapper(*args, **kwargs):
    ret = func(*args, **kwargs)
        request_finished()
        return ret
    return wrapper

@outer
def index(request):
    return HttpResponse(“Hello World!”)
但是有了信号之后,我们的解决方法会方便很多!
Django内置了很多高级的信号,提供一些特殊的服务,其中有一个信号名为request_finished,让我们来看看怎么玩。
首先,定义一个接收函数,接收函数可以是任何的Python函数或者方法:
def my_callback(sender, **kwargs):
    print(“Request finished!”)
其次,将该接收函数绑定到request_finished信号上,有如下两种方式:
方式一:
from django.core.signals import request_finished

request_finished.connect(my_callback)
方式二:
from django.core.signals import request_finished
from django.dispatch import receiver

@receiver(request_finished)
def my_callback(sender, **kwargs):
   print(“Request finished!”)

def index(request):
    return HttpResponse(“Hello World!”)
通过以上简单的两步,我们的my_callback()函数就将在每次请求到来之前和结束之后被调用。

自定义信号

看到这里,很多同学会思考,除了Django框架自带的信号之外,我们可不可以自定义信号呢?是的,答案是肯定的,我们当然可以自定义自己的信号,下面我们来看看如何实现。
首先,自定义信号,所有信号都是django.dispatch.Signal的实例对象,定义一个名为my_signal的信号:
import django.dispatch

my_signal = django.dispatch.Signal()
其次,定义一个接收者receiver,发送信号的时候,该函数将被调用:
from django.dispatch import receiver

@receiver(my_signal)
def my_callback(sender, **kwargs):
    print(“Hello World!”)
最后,在你想要发送信号的视图函数中发送信号即可:
from django.shortcuts import render, HttpResponse

def index(request):
    my_signal.send(sender=my_signal)
    return HttpResponse(“Hello World!”)
至此,以后每一次访问index页面,屏幕上面都将打印Hello World。

Django常用的内置信号介绍

Django内部提供了一组信号,方便用户使用,这些信号包含了一些非常有用的功能,下面来做一个简单介绍:
django.db.models.signals.pre_save & django.db.models.signals.post_save。每次model的save()方法被调用前后,该信号将被发送。
django.db.models.signals.pre_delete & django.db.models.signals.post_delete。每次model的delete()方法被调用前后,该信号将被发送。
django.db.models.signals.m2m_changed。每次ManyToMany字段被修改都会发送该信号。
django.core.signals.request_started & django.core.signals.request_finished。开始或者结束一个HTTP请求的时候都会发送该信号。

原文地址:https://www.cnblogs.com/paulwhw/p/9380183.html

时间: 2024-11-06 09:47:19

Django中的信号简介的相关文章

Django中的信号及其用法

Django中提供了"信号调度",用于在框架执行操作时解耦. 一些动作发生的时候,系统会根据信号定义的函数执行相应的操作 Django中内置的signal Model_signals pre_init # Django中的model对象执行其构造方法前,自动触发 post_init # Django中的model对象执行其构造方法后,自动触发 pre_save # Django中的model对象保存前,自动触发 post_save # Django中的model对象保存后,自动触发 p

Django中的信号

Django中内置的signal Django中提供了"信号调度",用于在框架执行操作时解耦. 一些动作发生的时候,系统会根据信号定义的函数执行相应的操作 Model_signals pre_init # Django中的model对象执行其构造方法前,自动触发 post_init # Django中的model对象执行其构造方法后,自动触发 pre_save # Django中的model对象保存前,自动触发 post_save # Django中的model对象保存后,自动触发 p

Django中 @login_required用法简介

我们在网站开发过程中,经常会遇到这样的需求: 用户登陆系统才可以访问某些页面 如果用户没有登陆而直接访问就会跳转到登陆界面,而不能访问其他页面. 用户在跳转的登陆界面中完成登陆后,自动访问跳转到之前访问的地址 要实现这样的需求其实很简单: 使用django自带的装饰器 @login_required. 在相应的view方法的前面添加@login_required 并在settings.py中配置LOGIN_URL参数 修改login.html中的表单action参数 view.py设置: fro

Django缓存,信号,序列化

缓存 1.缓存的简介 在动态网站中,用户所有的请求,服务器都会去数据库中进行相应的增,删,查,改,渲染模板,执行业务逻辑,最后生成用户看到的页面. 当一个网站的用户访问量很大的时候,每一次的的后台操作,都会消耗很多的服务端资源,所以必须使用缓存来减轻后端服务器的压力. 缓存是将一些常用的数据保存内存或者memcache中,在一定的时间内有人来访问这些数据时,则不再去执行数据库及渲染等操作,而是直接从内存或memcache的缓存中去取得数据,然后返回给用户. 2.Django提供了6种缓存方式 开

django的缓存,信号,序列化

一 Django的缓存机制 1.1 缓存介绍 1.缓存的简介 在动态网站中,用户所有的请求,服务器都会去数据库中进行相应的增,删,查,改,渲染模板,执行业务逻辑,最后生成用户看到的页面. 当一个网站的用户访问量很大的时候,每一次的的后台操作,都会消耗很多的服务端资源,所以必须使用缓存来减轻后端服务器的压力. 缓存是将一些常用的数据保存内存或者memcache中,在一定的时间内有人来访问这些数据时,则不再去执行数据库及渲染等操作,而是直接从内存或memcache的缓存中去取得数据,然后返回给用户.

Django缓存和信号

Django进阶之缓存和信号 一.缓存 简介 由于Django是动态网站,所有每次请求均会去数据进行相应的操作,当程序访问量大时,耗时必然会更加明显,最简单解决方式是使用:缓存,缓存将一个某个views的返回值保存至内存或者memcache中,5分钟内再有人来访问时,则不再去执行view中的操作,而是直接从内存或者Redis中之前缓存的内容拿到,并返回. Django提供了6种缓存方式: 1.    开发调试 2.    内存 3.    文件 4.    数据库 5.    Memcache缓

Django 缓存、信号

Reference: http://www.cnblogs.com/lianzhilei/p/6365877.html 缓存 由于Django是动态网站,所有每次请求均会去数据进行相应的操作,当程序访问量大时,耗时必然会更加明显,最简单解决方式是使用:缓存,缓存将一个某个views的返回值保存至内存或者memcache中,5分钟内再有人来访问时,则不再去执行view中的操作,而是直接从内存或者Redis中之前缓存的内容拿到,并返回 Django中提供了6种缓存方式: 开发调试 内存 文件 数据库

十六 Django框架,信号

Django中提供了"信号调度",用于在框架执行操作时解耦.通俗来讲,就是一些动作发生的时候,信号允许特定的发送者去提醒一些接受者. 也就是当程序有指定动作时,触发一个信号函数 1.Django内置信号 Model signals #数据库操作时 pre_init # django的modal执行其构造方法前,自动触发 post_init # django的modal执行其构造方法后,自动触发 pre_save # django的modal对象保存前,自动触发 post_save #

Django中的csrf基础了解

简介 django为用户实现防止跨站请求伪造的功能,通过中间件 django.middleware.csrf.CsrfViewMiddleware 来完成.而对于django中设置防跨站请求伪造功能有分为全局和局部. 全局: 中间件 django.middleware.csrf.CsrfViewMiddleware 局部: @csrf_protect,为当前函数强制设置防跨站请求伪造功能,即便settings中没有设置全局中间件. @csrf_exempt,取消当前函数防跨站请求伪造功能,即便s