-
Django 提供一个了“信号分发器”机制,允许解耦的应用在框架的其它地方发生操作时会被通知到。 通俗而讲Django信号的工作原理就是当某个事件发生的时候会发出一个信号(signals), 而监听这个信号的函数(receivers)就会立即执行。Django信号的应用场景很多,尤其是用于不同模型或程序间的联动。常见例子包括创建User对象实例时创建一对一关系的UserProfile对象实例,或者每当用户下订单时触发给管理员发邮件的动作。今天小编我就分享下如何正确使用Django的信号(signals)。 Django信号的一个简单例子假设我们有一个如下User模型,我们希望每次有User对象新创建时都打印出有新用户注册的提示信息,我们可以使用Django信号(signals)轻松实现。我们的信号发送者sender是User模型,每当User模型执行post_save动作时就会发出信号。此时我们自定义的create_user函数一旦监听到User发出的post_save信号就会执行,先通过if created判断对象是新创建的还是被更新的;如果对象是新创建的,就会打印出提示信息。# models.py12345678910111213141516from django.db import models from django.db.models import signalsfrom django.dispatch import receiver class User(models.Model): name = models.CharField(max_length=16) gender = models.CharField(max_length=32, blank=True) def create_user(sender, instance, created, **kwargs): if created: print("New user created!") post_save.connect(create_user, sender=User)在上例中我们使用了信号(post_save)自带的connect的方法将自定义的函数与信号发出者(sender)User模型进行了连接。在实际应用中一个更常用的方式是使用@receiver装饰器实现发送者与监听函数的连接,如下所示。@receiver(post_save, sender=User)读起来的意思就是监听User模型发出的post_save信号。123456789101112131415from django.db import models from django.db.models.signals import post_savefrom django.dispatch import receiver class User(models.Model): name = models.CharField(max_length=16) gender = models.CharField(max_length=32, blank=True) @receiver(post_save, sender=User)def create_user(sender, instance, created, **kwargs): if created: print("New user created!") 利用Django信号实现不同模型的联动更新我们再来看一个复杂一点的例子。我们有一个Profile模型,与User模型是一对一的关系。我们希望创建User对象实例时也创建Profile对象实例,而使用post_save更新User对象时不创建新的Profile对象。这时我们就可以自定义create_user_profile和save_user_profile两个监听函数,同时监听sender(User模型)发出的post_save信号。由于post_save可同时用于模型的创建和更新,我们用if created这个判断来加以区别。12345678910111213141516from django.db import modelsfrom django.db.models.signals import post_savefrom django.dispatch import receiver class Profile(models.Model): user = models.OneToOneField(User, on_delete=models.CASCADE) birth_date = models.DateField(null=True, blank=True) @receiver(post_save, sender=User)def create_user_profile(sender, instance, created, **kwargs): if created: Profile.objects.create(user=instance) @receiver(post_save, sender=User)def save_user_profile(sender, instance, **kwargs): instance.profile.save() Django常用内置信号之前的例子中我们使用的都是post_save信号,即在模型调用save()方法后才发送信号。Django其它常用内置信号还包括:django.db.models.signals.pre_save & post_save在模型调用 save()方法之前或之后发送。django.db.models.signals.pre_init& post_init在模型调用_init_方法之前或之后发送。django.db.models.signals.pre_delete & post_delete在模型调用delete()方法或查询集调用delete() 方法之前或之后发送。django.db.models.signals.m2m_changed在模型多对多关系改变后发送。django.core.signals.request_started & request_finished Django建立或关闭HTTP 请求时发送。 如何正确放置Django信号的监听函数代码在之前案例中,我们将Django信号的监听函数写在了models.py文件里。当一个app的与信号相关的自定义监听函数很多时,此时models.py代码将变得非常臃肿。一个更好的方式把所以自定义的信号监听函数集中放在app对应文件夹下的signals.py文件里,便于后期集中维护。假如我们有个account的app,包含了User和Pofile模型,我们不仅需要在account文件夹下新建signals.py,还需要修改account文件下apps.py和__init__.py,以导入创建的信号监听函数。# account/signals.py123456789101112131415161718192021from django.db.models.signals import post_savefrom django.dispatch import receiverfrom .models import User, Profile @receiver(post_save, sender=User) def create_user_profile(sender, instance, created, **kwargs): if created: Profile.objects.create(user=instance) @receiver(post_save, sender=User) def save_user_profile(sender, instance, **kwargs): instance.profile.save()# account/apps.py1234567from django.apps import AppConfig class AccountConfig(AppConfig): name = 'account' def ready(self): import account.signals# account/__init__.py1default_app_config = 'account.apps.AccountConfig'
-
1、quicktool/view.py文件修改视图函数index(),渲染一个home.html模板,在视图中传递一个字符串名称是 string 到模板 home.html123def index(request): string = u'这是一个由Django2.1.7版本写出的视图内容!' return render(request, 'home.html',{'string':string})2、quicktool(应用app)下创建一个templates文件夹(模板),在templates下创建一个home.html1234567891011<!DOCTYPE html><html><head> <title>学习Django</title></head><body> {{ string }} </body></html>知识点扩展:在django中,带有HTML标签的字符串,如str = "aa a",我们通过template展示在html页面中时,django会自动转义为可显示的html字符串,即将html标签的尖括号等字符转义。如字符串中的空格会显示为 ,尖括号会显示为 <、 >等等。当我们不需要此自动转换,如上述str在html页面直接显示为aa a时,可通过多种方法禁止django进行自动转义。1. 对于单个变量,可以在其后面加上safe过滤器,告诉Django这个字符串不用进行HTML转义。比如:12This will be escaped: {{ data }}This will not be escaped: {{ data|safe }}2.对于一段模板内容可以使用autoescape标签,比如:123{% autoescape off %}Hello {{ name }}{% endautoescape %}
-
URL和View的关系1、每次用户发来一个HttpRequest请求,Django会用URL_pattern与请求进行匹配,匹配到第一个URL_pattern就会把请求转向对应的view2、view用来响应request,并返回response,response里可以包含网页文件呀,图片等等。所以项目中绝大部分代码均在此编写。view 可以引入通用模板来减少代码量,具体查看文档1Use generic views3、view引入HTML文件的方法:在一个app下建立一个templates文件夹,将html文件放进去该文件夹这里其实不一定要把HTML文件放在这个templates里,可以随意定义不过,需要在setting.py里,找到templates,修改DIRS:[ os.path.join (BASE_DIR,'你定义的html存放的文件夹')]在app下 view.py 文件,在里面写好view函数def 函数名(request):1return render(request,'index.html')render(渲染)需要三个变量, 第一个变量是request请求,第二个是模版所在目录,第三个是一个字典(可选),字典用于对应模板里设计的变量,可以用locals()将函数里设计的变量自动转换为字典4、在对于app下创建一个urls.py ,写入如下内容12345from django.urls import pathfrom . import viewsurlpatterns = [ path('', views.index, name='index'),]5、在项目文件夹里找到 urls.py 加入如下内容123456from django.urls import include, pathurlpatterns = [ path('polls/', include('polls.urls')), path('admin/', admin.site.urls),]对于<a>标签里的 href 可以用 {% url 'url名' %}来代替,url名指的是 urls.py 里的path('login.html/', views.my_login, name='url名'),Django 中通常使用 get_object_or_404()来捕捉 404 错误,而不用自己写 try...except123def detail(request, question_id): question = get_object_or_404(Question, pk=question_id) return render(request, 'polls/detail.html', {'question': question})补充:django中url与view配置方法django中url与view配置方法(一)url.py12345from django.conf.urls import urlfrom . import viewsurlpatterns = [ url(r'^$', views.showAssets, name='show_assets'),]views.py12345# -*- coding: utf-8 -*-from django.shortcuts import render_to_response# Create your views here.def showAssets(request): return render_to_response('assets_index.html', {})django中url与view配置方法(二)url.py123456# -*- coding: utf-8 -*-from django.conf.urls import urlfrom app001.views import IndexViewurlpatterns = [ url(r'^admin/', admin.site.urls), url(r'^$', IndexView.as_view(), name="index"), ]views.py1234567# -*- coding: utf-8 -*-from django.views.generic.base import Viewfrom django.shortcuts import render# Create your views here.class IndexView(View): def get(self, request): return render(request, 'index.html', {})
-
软件介绍 Django是开放源代码的Web应用框架,由Python写成。采用了MVT软件设计模式,即模型(Model)、视图(View)和模板(Template)。Django的主要目标是使得开发复杂的、数据库驱动的网站变得简单。Django注重组件的重用性和“可插拔性”。 支持的操作系统经过华为云严格实测,以下操作系统在鲲鹏生态中可以完整运行Django的全部功能:l CentOS 7.5l EulerOS 2.8支持版本和获取方式l 建议使用版本为“Django-2.2.3”l 通过pip命令获取安装。安装和测试方式1. 选择操作环境本文选用华为鲲鹏云服务ECS KC1实例做测试,详细配置如下:类别子项版本云服务器配置ECS实例类型kc1.xlarge.4ECS配置4U16GBEVS高IO(40GB)云OSCentOS7.5Kernel4.14.0-492. 搭建安装环境步骤一:查看Python版本查看Python版本。“Django-2.2.3”依赖于“Python3.5”及以上版本,查看当前系统安装Python的版本号python --version回显内容如下:Python 2.7.5步骤二:升级Python需要升级python,步骤如下:1) 安装“Python3.5.6”。a. 下载“Python3.5.6”。wget https://www.python.org/ftp/python/3.5.6/Python-3.5.6.tgzb. 解压压缩包并进入解压目录。tar -zxvf Python-3.5.6.tgz && cd Python-3.5.6c. 进行配置、编译、安装。./configure && make && make install2) 进行链接替换。由于yum命令依赖于“Python2.x”,所以不能卸载“Python2.x”,为了解决“Python2.x”与“Python3.x”的冲突,需要进行链接替换。a. 将指向“Python2.x”的软链接“/usr/bin/python”改为指向“Python3.x”。ln -s /usr/local/bin/python3 /usr/bin/python -fb. 对pip进行链接替换。ln -s /usr/local/bin/pip3 /usr/bin/pip -f3) 安装setuptools。a. 下载setuptools。wget https://files.pythonhosted.org/packages/c2/f7/c7b501b783e5a74cf1768bc174ee4fb0a8a6ee5af6afa92274ff964703e0/setuptools-40.8.0.zipb. 解压压缩包并进入解压目录。unzip setuptools-40.8.0.zip && cd setuptools-40.8.0c. 安装setuptools。python setup.py install3. 安装Django使用pip命令安装Django。Django依赖于pytz和sqlparse,手动安装Django需要先安装依赖包。pip install django安装成功后,回显内容如下:Installing collected packages: sqlparse, pytz, djangoSuccessfully installed django-2.2.3 pytz-2019.1 sqlparse-0.3.04. 测试已完成安装的软件1) 打开Python交互界面,直接执行python命令。2) 导入Django。import django3) 查看安装的Django版本号。print (django.get_version())回显内容如下:>>> print (django.get_version())2.2.3
-
软件介绍 Django是开放源代码的Web应用框架,由Python写成。采用了MVT软件设计模式,即模型(Model)、视图(View)和模板(Template)。Django的主要目标是使得开发复杂的、数据库驱动的网站变得简单。Django注重组件的重用性和“可插拔性”。 支持的操作系统经过华为云严格实测,以下操作系统在鲲鹏生态中可以完整运行Django的全部功能:l CentOS 7.5l EulerOS 2.8支持版本和获取方式l 建议使用版本为“Django-2.2.3”l 通过pip命令获取安装。安装和测试方式1. 选择操作环境本文选用华为鲲鹏云服务ECS KC1实例做测试,详细配置如下:类别子项版本云服务器配置ECS实例类型kc1.xlarge.4ECS配置4U16GBEVS高IO(40GB)云OSCentOS7.5Kernel4.14.0-492. 搭建安装环境步骤一:查看Python版本查看Python版本。“Django-2.2.3”依赖于“Python3.5”及以上版本,查看当前系统安装Python的版本号python --version回显内容如下:Python 2.7.5步骤二:升级Python需要升级python,步骤如下:1) 安装“Python3.5.6”。a. 下载“Python3.5.6”。wget https://www.python.org/ftp/python/3.5.6/Python-3.5.6.tgzb. 解压压缩包并进入解压目录。tar -zxvf Python-3.5.6.tgz && cd Python-3.5.6c. 进行配置、编译、安装。./configure && make && make install2) 进行链接替换。由于yum命令依赖于“Python2.x”,所以不能卸载“Python2.x”,为了解决“Python2.x”与“Python3.x”的冲突,需要进行链接替换。a. 将指向“Python2.x”的软链接“/usr/bin/python”改为指向“Python3.x”。ln -s /usr/local/bin/python3 /usr/bin/python -fb. 对pip进行链接替换。ln -s /usr/local/bin/pip3 /usr/bin/pip -f3) 安装setuptools。a. 下载setuptools。wget https://files.pythonhosted.org/packages/c2/f7/c7b501b783e5a74cf1768bc174ee4fb0a8a6ee5af6afa92274ff964703e0/setuptools-40.8.0.zipb. 解压压缩包并进入解压目录。unzip setuptools-40.8.0.zip && cd setuptools-40.8.0c. 安装setuptools。python setup.py install3. 安装Django使用pip命令安装Django。Django依赖于pytz和sqlparse,手动安装Django需要先安装依赖包。pip install django安装成功后,回显内容如下:Installing collected packages: sqlparse, pytz, djangoSuccessfully installed django-2.2.3 pytz-2019.1 sqlparse-0.3.04. 测试已完成安装的软件1) 打开Python交互界面,直接执行python命令。2) 导入Django。import django3) 查看安装的Django版本号。print (django.get_version())回显内容如下:>>> print (django.get_version())2.2.3
上滑加载中
推荐直播
-
华为云码道Skill实战与极速交付,智能开发全链路实战2026/07/22 周三 19:00-21:00
王一男-华为云码道产品规划专家;李炎-华为云码道产品专家;姜浩-华为云HCDG核心组成员
直播深度解读华为云码道6月产品新特性,从Skill市场安装专家技能,带你零距离体验从需求,开发,审查,重构全链路闭环的开发过程。从零构建并交付一个完整项目,让您体验从代码提交到服务上线的“极速”之旅。
回顾中 -
聚开发者之力,创具身新未来2026/07/23 周四 15:00-17:00
张豪杰/程文/王军/刘新春/黄钦开 /张晓天
本次华为云具身智能开发平台CloudRobo培训面向具身智能开发者,带您全流程体验机器人本体R2C小时级接入、环境重建与轨迹生成仿真数据生产、PB级数据管理、数据评测、模型训推、强化学习和Benchmark一键评测等功能,并体验业界主流具身模型应用。
回顾中
热门标签