• [技术干货] 正确的理解和使用Django信号(Signals)
    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'
  • [技术干货] django中显示字符串的实例方法
    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 %}
  • [技术干货] Django URL和View的关系说明
    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 2.2.3 移植指南(CentOS 7.5)
    软件介绍 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 2.2.3 移植指南(CentOS 7.5)
    软件介绍 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
总条数:30 到第
上滑加载中