Python开发运维:Django 4.2.7 使用Celery 5.3.5 完成异步和定时任务

目录

一、理论

1.Django

二、实验

1.Django使用Celery完成异步和定时任务

三、问题

1. 如何查看Django版本

2.view视图如何匹配

3.Django如何使用MySQL数据库

4.Django如何使用Model(模型类)

5.Django如何启动内置管理后台


一、理论

1.Django

(1) 概念

        Django是Python的一个主流Web框架,提供一站式解决方案,开发成本低,内建ORM、数据管理后台、登录 认证、表单、RESTAPI等功能,适合开发中大型项目。

        其他Web框架: Flask(轻量级)、Tornado(异步)

(2)发展历程

(3)Django工作流程

(4)URL路由系统

      ① 路由系统

        它是URL路径和视图函数的一个对应关系,也可以称为转发器。

      ② URL路由分发

        优势:urls配置解耦,方便管理。

(5)Django 视图

① Django内置函数

② HTTP工作流程

③ HTTP请求流程

④ HttpRequest对象(常用属性)

        Django会建立一个包含请求源数据的HttpRequest对象,当Django加载对应的视图时,HttpRequest 对象将作为函数视图的第一个参数(request),每个视图负责返回一个HttpResponse对象。

⑤ HttpRequest对象(常用方法)

⑥ HttpRequest对象(QueryDict对象)

⑦ HttpResponse对象

1)HttpResponse函数
给浏览器返回数据。
语法:HTTPResponse(content=响应体,content_type=响应体数据类型,status=状态码)

2)render函数
render指定模板,返回一个渲染后的HttpResponse对象。
语法:render(request, template_name, context=None, content_type=None, status=None, using=None)
• request:固定参数,django封装的请求
• template_name:返回html模板
• context:传入模板中的内容,用于渲染模板,默认空字典

3)redirect函数
redirect函数:重定向,发起第二次请求
语法:redirect(to, *args, **kwargs)
参数可以是:
• 一个视图
• 一个绝对的或者相对的URL
• 一个模型,对象是重定向的URL

4)StreamingHttpResponse函数
流式响应可迭代对象

5)FileResponse函数
如果提供文件下载建议方法

6)JsonResponse函数
响应一个JSON对象

(6)Django 模板系统

        Django模板系统:用于自动渲染一个文本文件,一般用于HTML页面。模板引擎渲 染的最终HTML内容返回给客户端浏览器。

         模板文件有两部分组成:

1)静态部分,例如html、css、js

2)动态部分,django模板语言,类似于jinja语法

①变量(设置全局变量)

<h3>欢迎:{{ username }}</h3>

② 标签(条件判断)

if条件判断:判定给定的条件是否满足(True或False),根据判断的结果决定执行的语句。
语法:
{% if <表达式> %}
<内容块>
{% elif <表达式> %}
<内容块>
{% else %}
<内容块>
{% endif %}

③ 标签(条件判断)

# 相等执行内容块
{% ifequal <值1> <值2> %}
<内容块>
{% endifequal %}
# 不相等执行内容块
{% ifnotequal <值1> <值2> %}
<内容块>
{% endifnotequal %}

④标签(操作符)

⑤标签(循环)

for循环:一般用于遍历数据类型的元素进行处理,例如列表。
语法:
{% for <变量> in <序列> %}
<内容块> 
{% endfor %}

⑥标签(forloop变量)

forloop是在{% for %}标签中生成的变量,用于获取当前循环进展信息。

⑦标签(for empty)

for...empty 当循环的序列为空时,执行empty下面的内容。
语法:
{% for <变量> in <序列> %}
<遍历>
{% empty %}
<代码块>
{% endfor %}

 ⑧标签(注释)

注释:
{# 注释内容 #}

(7)常用过滤器

过滤器:在变量被显示前修改值的一种方法。
语法:{{ value | 过滤器:参数 }}

自定义过滤器:

1)在app下创建templatetags目录

2)自定义过滤器函数
from django.template import Library
register = Library() # 注册过滤器对象
@register.filter # 通过装饰注册自定义过滤器
def func(n):
return n / 2

3)在模板中使用
{% load filters %}
{{ 123 | func }}

(8)模板继承

模板继承主要是为了提高代码重用,减轻开发人员的工作量。
典型应用:网站的头部、尾部信息。
1)定义一个基础模板,也称为母板,这个页面存放整个网站共用的内容
templates/base.html
2)在子模板继承这个母版
{% extends ‘base.html’ %}
3)在基础模板预留子模板差异化内容
{% block 名称 %} 预留区域 {% endblock %}
4)在子模板里同样语法引用并填充预留区域内容

(9)模板导入

1)模板导入
导入一个模板(一般是某个网页功能)到当前模板

2)将一个功能创建为模板
# templates/hello.html
<style>
.hello {
background-color: red;
}
</style>
<div class="hello">
子模板
</div>

3)模板导入
{% extends 'base.html' %}
{% block title %}首页{% endblock %}
{% block context %}
<h1>这是首页!</h1>
{% include "hello.html" %}
{% endblock %}

(10)引用静态文件

STATICFILES_DIRS:告诉Django哪个目录是“静态文件的文件夹”
STATIC_ROOT:指出浏览器访问静态文件“根路径”

1)在settings.py配置
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
STATICFILES_DIRS = (
os.path.join(BASE_DIR, 'static'),
)
STATIC_URL = '/static/'

2)在模板文件引用静态文件
<link rel="stylesheet" href="/static/main.css">
或者
<link rel="stylesheet" href="{% static 'main.css' %}">

(11)Django ORM

① 静态网站与动态网站

②ORM

1)ORM
对象关系映射(Object Relational Mapping,ORM):是一种程序设计技术,用于实现面向对象编程语言里不同类型系统的数据之间的转换。简单来说就是在编程语言中实现的一种虚拟对象数据库。我们对虚拟对象数据库进行操作,它会转换成具体的SQL去操作数据库,这样一来我们就不需要学习复杂的SQL语句了。

2)ORM优势
不必熟悉复杂的SQL语句,容易上手,避免新手写SQL效率问题。

③模型中的Meta类与方法

Django模型类的Meta是一个内部类,它用于定义一些Django模型类的行为特性。

⑤模型类常用字段

⑥模型类常用字段选项

⑦QuerySet序列化

序列化:将Python对象转为传输的数据格式
反序列化:将传输的数据格式转为Python对象
ORM查询返回的是QuerySet对象,如果要提供数据接口,这显然是不行的。

有两种方法可以转为JSON字符串:
1)使用内建函数 serializers
2)遍历QuerySet对象将字段拼接成字典,再通过json库编码

(12)Django 多表操作

①多表关系

常见的数据模型关系有:
1)一对一(one-to-one),OneToOneField

2)一对多,多对一(one-to-many),ForeignKey

3) 多对多(many-to-many),ManyToManyField

② 一对一

#一个表中的每条记录对应另一个表中的每条记录,使用OneToOneField建立关系
user = models.OneToOneField(User) # 定义一对一的模型关系

③一对多

#一对一是表与表之间的关系,而一对多、多对多是表与表中数据的关系
#一对多:A表中的某个记录对应B表中的多条记录,使用ForeignKey建立关系
project = models.ForeignKey(Project) # 定义一对多的模型关系

例如:项目部署涉及表 一个项目有多个应用,一个应用只能属于一个项目 一个应用部署到多台服务器,一个服务器部署多个应用。

④ 多对多

#A表中的某个记录对应B表中的多条记录,B表中的某个记录对应A表中多条记
录,使用ManyToManyField建立关系。

app = models.ManyToManyField(App)

例如:一个应用部署到多台服务器,一个服务器部署多个应用.

创建模型关系:

Django会自动创建一个表来管理多对多关系,称为中间表;这个中间表的名称使用多对多的
名称和包含这张表的模型的名称生成,也可以使用db_table选项指定这个中间表名称。

(13)Django 用户认证系统

Django内置一个用户认证系统,使用auth模块实现。
auth模块提供了登录、注册、效验、修改密码、注销、验证用户是否登录等功能。

①用户认证系统

Django默认创建的数据库表:
• auth_user :用户表
• auth_user_groups :用户所属组的表
• auth_user_user_permissions :用户权限表
• auth_group :用户组表
• auth_group_permissions :用户组权限表
• auth_permission :存放全部权限的表,其他的表的权限都是从此表中外键连接过去的
• django_session :保存HTTP状态
• django_migrations :数据库迁移记录

②常用模块

1)登录认证
auth模块:login()

2)退出登录
auth模块:logout()

3)装饰器
auth模块:login_required装饰器,判断用户是否登录,如果没有登录引导至登录页面,登录
成功后跳转到目的页面。

(14)Django Session管理

① Session与Cookie

② Django使用Session

在settings.py配置文件中设置客户端Cookie:

在视图中操作Session:

(15)Django CSRF防护

①CSRF

CSRF(Cross Site Request Forgery):跨站请求伪造,实现的原
理是CSRF攻击者在用户已经登录目标网站之后,诱使用户访问一个攻
击页面,利用目标网站对用户的信任,以用户身份在攻击页面对目标网
站发起伪造用户操作的请求,达到攻击目的。

②使用CSRF防护机制

常见有三种方法可以携带CSRF Token发送给服务端:
1) from表单添加{% csrf_token %}标签,表单会携带一同提交
2) 如果你是Ajax请求,需要把csrf token字符串(也是通过拿{% csrf_token %}标签产生的值)放到data里一起提交,
并且键名为csrfmiddlewaretoken或者放到请求头传递服务端
3) 指定取消某函数视图CSRF防护

③使用CSRF防护机制

方法1:
<form method="post">
{% csrf_token %}
用户名: <input type="text" name="username"><br>
密码: <input type="text" name="password"><br>
<button type="submit">登录</button>
</form>

方法2:
var csrf_token = $("[name='csrfmiddlewaretoken']").val();
var data = {'id': '123', 'csrfmiddlewaretoken': csrf_token};
$.ajax({
type: "POST",
url: "/api",
data: data,
dataType: 'json'
})

方法3:
from django.views.decorators.csrf import csrf_exempt
@csrf_exempt
def index(request):
return render(request, 'index.html')

二、实验

1.Django使用Celery完成异步和定时任务

(1)安装Django

5a9464f9ec8747a5a871ef12af45ee40.png

(2)新建Django项目

44a8545a19964884ba77d3f08d214911.png

(3)初始框架

4d8c2ecf5fb24ad6afff188b38689882.png

(4)urls.py引用视图views

from django.contrib import admin
from django.urls import path
from app01 import views

urlpatterns = [
    path('admin/', admin.site.urls),
    path('test/',views.test)
]

d7fc8b935f81497dbd084c115bfe697d.png

(5)编写view

from django.shortcuts import render,HttpResponse

# Create your views here.
def test(request):

    return HttpResponse("OK")

01feeba7ee1a41b6ba501630f5ec94fc.png

(6)点击运行

06027a586da5472cb8b40776ade14fc7.png

(7)查看运行结果,点击链接

daa1cbd3a45d4a03a11749a80f5a2c79.png

(8)显示OK

http://127.0.0.1:8000/test/

76d7e51dd94540c8ad89f872b203bfa2.png

(9)新建消费者目录mycelery

50975546a2984fe483d121edb726171f.png

(10)tasks.py文件定义异步或定时任务

c9b8ff5e829e46c39a87acd80b02bcf0.png

(11)编写配置文件config.py

#消息中间件
broker_url = 'redis://127.0.0.1:6379/15'
#异步存储地方
result_backend = 'redis://127.0.0.1:6379/14'

c202d200f6bb4d10b02aac06b616ae42.png

(12)main.py将配置文件解耦

# -*- coding: utf-8 -*-
# 主程序
import os
import celery as celery
from celery import Celery
import eventlet
# 创建celery实例对象
app = Celery("djcelery")
# 把celery和django进行组合,识别和加载django的配置文件
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'celeryPros.settings.dev')
# 通过app对象加载配置
app.config_from_object("mycelery.config")
# 加载任务
# 参数必须必须是一个列表,里面的每一个任务都是任务的路径名称
# app.autodiscover_tasks(["任务1","任务2"])
app.autodiscover_tasks(["mycelery.sms",])

655de13e4cd4427d834992a34875add8.png

(13)tasks文件

# -*- coding: utf-8 -*-
# celery的任务必须写在tasks.py的文件中,别的文件名称不识别!!!
from mycelery.main import app
import time
import logging
log = logging.getLogger("django")
@app.task  # name表示设置任务的名称,如果不填写,则默认使用函数名做为任务名
def send_sms(mobile):
    """发送短信"""
    print("向手机号%s发送短信成功!"%mobile)
    time.sleep(5)
    return "send_sms OK"
@app.task  # name表示设置任务的名称,如果不填写,则默认使用函数名做为任务名
def send_sms2(mobile):
    print("向手机号%s发送短信成功2!"%mobile)
    time.sleep(5)
    return "send_sms2 OK"

62620b8b00d047ebb4f6480f79975ae1.png

(14)view视图添加异步代码

from django.shortcuts import render,HttpResponse
# Create your views here.
from mycelery.sms.tasks import send_sms,send_sms2
def test(request):
    #异步任务
    # 1. 声明一个和celery一模一样的任务函数,但是我们可以导包来解决
    # send_sms.delay("139XXXXXXXX")
    # send_sms2.delay("135XXXXXXXX")
    # send_sms.delay() 如果调用的任务函数没有参数,则不需要填写任何内容

f2dbe534582146f8aff7f77cedbf0ffc.png

(15)浏览器刷新或回车,进行观察

cc4816e2f20344b3b3214b9b7d14437b.png

(16)消费者一方配置完成

120dc93fd71e4bba828e8c20760617e8.png

(17) mycelery根目录

9461d0dbae3d44c7bf3edb2e32ab9fd5.png

(18)已启动消费

PS D:\soft\Djcelery> celery --app=mycelery.main worker -n node1 -l INFO -P eventlet

1656a3e859874dc9a5724db7e8352afc.png

(19)查看异步消息

f2e57b9088aa41d9ba087e61d1d8a24f.png

(20)注释异步任务代码

79fefee8862248368ac2339656859b48.png

(21)添加定时任务代码

    #定时任务
    from datetime import datetime,timedelta
    ctime = datetime.now()
    # 默认用utc时间
    utc_ctime = datetime.utcfromtimestamp(ctime.timestamp())
    time_delay = timedelta(seconds=10)
    task_time = utc_ctime + time_delay
    result = send_sms.apply_async(["136XXXXXXXX", ], eta=task_time)
    print(result.id)

29ded7510c854ca2b62b7256ce541dd1.png

(22)浏览器再次刷新或回车,进行观察

5710441dc152442385b142237a6646d5.png

(23)查看定时消息

013c86c38e8947f9853fe7fb3ce76862.png

(24)查看RUN结果

cf0fb8b158434f4fad0d3250dcae1882.png

(25)完整项目架构

b703389168dc462ebdc6e19b83e97dca.png

(26)查看Redis可视化界面

0e08f08eb733447e94fd7e092f1e7ba9.png

cc6400fb94a84fcfa76e947deafe376e.png

e7087865617743b4b029ebb975817699.png

a5d29e2cd7f249699228817ad7e157de.png

三、问题

1. 如何查看Django版本

(1)方式一

indows系统下,在cmd命令窗口中输入python进入Python解释器
Linux系统下, 直接使用终端调用Python解释器

接下来输入:
>>> import django
>>> print django.VERSION # Python2的格式
>>> print(django.VERSION) # Python3的格式 

或者输入:
>>> django.get_version()  # 获取当前djiango版本号

(2)方式二

在IDE内 的terminal 内输入

python -m django --version

django-admin --version

这两个命令 一样可以查询到。

注意:通常在项目的目录下查询。这种方式适合项目已经建立,虚拟Python环境也已经配置好。Django不是全局安装的时候。

(3)方式三

Windows系统下,在cmd命令窗口中输入python进入Python解释器

Linux系统下,直接使用终端调用Python解释器

直接输入:
python -m django --version

django-admin --version

注意:这里django是全局安装。

(4)方法四

在项目目录下的lib文件夹内的site-packpage文件夹内直接可以看到Django版本。

6b6311d8fd3944f7968a718dde6af178.png

2.view视图如何匹配

(1)分组匹配

分组匹配内容会传递到函数视图位置参数

(2)匹配顺序

正则匹配从左到右,URL匹配从上到下

(3)context传入变量

view视图函数的context传入变量,变量类似于字典,模板中引用变量{{   }},模板中引用函数{% %}

3.Django如何使用MySQL数据库

(1)使用docker启动一个mysql实例

docker run -d \
--name db \
-p 3306:3306 \
-v mysqldata:/var/lib/mysql \
-e MYSQL_ROOT_PASSWORD=123456 \
mysql:5.7 --character-set-server=utf8

(2)使用pip工具安装pymysql模块

pip install pymysql

(3)修改django默认连接数据库

# devops/settings.py
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'test',
'USER': 'root',
'PASSWORD': '123456',
'HOST': '192.168.31.62',
'PORT': '3306',
}
}

(4)指定数据库驱动

# myapp/__init__.py
import pymysql
pymysql.install_as_MySQLdb()

(5)执行迁移文件生成表

python mange.py migrate

4.Django如何使用Model(模型类)

(1)方法

1)使用模型类定义一个User表,包含多字段
# myapp/models.py
class User(models.Model):
user = models.CharField(max_length=30) # 用户名
name = models.CharField(max_length=30) # 姓名
sex = models.CharField(max_length=10) # 性别
age = models.IntegerField() # 年龄
label = models.CharField(max_length=100) # 标签

2)在settings.py配置文件中INSTALLED_APPS列表添加APP名称
INSTALLED_APPS = [
#...
'myapp',
]


3)将模型类生成具体的数据库表
# 生成迁移文件
python manage.py makemigrations
# 执行迁移文件生成表
python mange.py migrate

4)进入数据库查看表
生成表名的默认格式:应用名_模型类名小写

5.Django如何启动内置管理后台

(1)访问URL

from django.contrib import admin # 内建管理后台功能
from django.urls import path
urlpatterns = [
path('admin/', admin.site.urls), # 内建管理后台访问地址
]

(2)创建管理员账号

python manage.py createsuperuser

(3)注册模型

# myapp/admin.py
from django.contrib import admin
from myapp import models
admin.site.register(models.User)

(4)设置语言和时区

# devops/settings.py
LANGUAGE_CODE = 'zh-hans'
TIME_ZONE = 'Asia/Shanghai'
USE_I18N = True
USE_L10N = True
USE_TZ = False

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Python高效开发实战:Django、Tornado、Flask和Twisted是一本有关Python网络开发框架的教程,以PDF格式发布。这本书主要介绍了这四个框架的特点、用法和实际应用场景。 首先,Django是一个全功能的Web应用框架,它提供了大量的开箱即用的功能和工具,包括ORM(对象关系映射),模板引擎和路由系统等。Django适合构建大型、复杂的Web应用程序,它的优势在于快速开发和强大的安全性。 其次,Tornado是一个异步的Web框架,它具有高性能和可伸缩性。Tornado适用于处理大量并发请求的场景,它采用非阻塞IO模型和事件驱动的设计,可以轻松地处理高负载的网络应用。 另外,Flask是一个简洁灵活的微框架,它注重简单性和可扩展性。Flask非常适合构建小型的Web应用程序或者API接口,它是一个基础而易于上手的框架,同时也提供了大量的扩展库供开发使用。 最后,Twisted是一个异步网络编程框架,它可以构建各种类型的网络应用程序,包括Web服务器、邮件服务器和聊天程序等。Twisted提供了强大的异步网络编程支持,可以轻松地处理并发连接和高负载情况。 在这本书中,读者将学习到如何使用这四个框架来构建实际的网络应用程序。通过实战案例和示例代码,读者可以深入了解每个框架的特点和用法。同时,书中还介绍了一些常见的最佳实践和开发技巧,帮助读者提高开发效率和代码质量。 总而言之,这本书将帮助读者全面了解Python网络开发框架,并通过实际项目的案例帮助读者掌握框架的使用技巧和开发经验。无论是对于初学者还是有一定经验的开发者来说,这本书都是一本不可错过的学习资料。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值