web项目 day03(七)

云存储使用及异步上传

使用云存储的方式存储静态文件,首先要使用云存储平台,比较出名的云存储厂商有阿里,腾讯等,
七牛云也是国内比较成熟的云存储的厂商,这里以七牛云云存储为例,将静态文件上传到云存储

云存储存储空间的创建

首先注册账号
在这里插入图片描述
创建一个新的存储空间

在这里插入图片描述
创建成功之后,会有一个临时域名供测试使用
在这里插入图片描述
然后去查看官方SDK文档
在这里插入图片描述
文档中步骤很详细

云存储的使用

安装七牛云,可以在pycharm的终端中输入命令,也可以在Ubuntu终端输入
在这里插入图片描述
安装完之后,一定要更新依赖包到requirements.txt文件,否则其他开发人员这块就无法使用,且上线部署的时候安装相关依赖包时就缺少了该依赖包
在这里插入图片描述
为了安全起见,可以使用 git diff 命令查看不同,判断是否更新成功
在这里插入图片描述

  1. 其实使用非常简单,文档中很详细,给出了示例,直接先将代码拷贝过来
    在实际工作中,官方SDK文档中很多内容都写得很详细,要学会看文档,基本上示例文档中就满足了所需业务中80%左右的需求,只需要将示例代码按照自己的需求修改即可
    在这里插入图片描述
    这个是比较底层的功能,将代码放入libs文件夹中,
    在libs文件夹中新建一个qiniuyun .py文件,将代码复制进去

  2. 将一些公共的配置独立出来,放到common文件夹中的config .py文件中
    比如 Access Key 和 Secret Key,这个在密钥管理中可以获取
    在这里插入图片描述
    要上传的空间的名称就算自己创建的名称,域名就是上面提到的供测试用的临时域名
    在这里插入图片描述

  3. 修改qiniuyun .py文件中的代码
    定义一个函数用于上传文件,将原来代码中已经独立出去的部分删改

qiniuyun .py

from qiniu import Auth, put_file

from common import config


def upload(file_name, file_path):
    """
    本地文件上传至七牛云
    :param file_name:
    :param file_path:
    :return:
    """
    # 构建鉴权对象
    qn_auth = Auth(config.QN_ACCESS_KEY, config.QN_SECRET_KEY)

    # 生成上传 Token,可以指定过期时间等
    token = qn_auth.upload_token(config.QN_BUCKET_NAME, file_name, 3600)

    ret, info = put_file(token, file_name, file_path)

    return ret, info
  1. 七牛云的接口写完后,进行测试
    首先导入模块
    在这里插入图片描述
    输入条件,测试,返回成功
    在这里插入图片描述
    查看七牛云,文件上传成功
    在这里插入图片描述

异步上传

将文件上传到本地服务器

测试成功后,就是文件的上传了需要,将七牛云的代码写入到上传文件的接口中,也就是apis .py中的upload_avatar函数
在这里插入图片描述
如果这样将功能写进去,apis .py中的upload_avatar函数代码冗余会比较高,所以将一些功能独立出去

在logics .py文件中新建一个upload_avatar函数,用于封装文件名和文件对象,将文件路径返回
在这里插入图片描述
然后修改apis .py中的upload_avatar函数
在这里插入图片描述
这就是第一步,将文件上传到本地服务器

将本地文件上传到七牛云

同样道理,为了减少代码冗余,将本地文件上传到七牛云也封装一下

在logics .py文件中新建一个upload_qiniuyun函数,传入文件名和文件路径,用于上传文件,返回状态码,如果返回200说明返回成功
在这里插入图片描述
然后修改apis .py中的upload_avatar函数
在这里插入图片描述

进行测试
在这里插入图片描述
此时,本地和云存储都多了一张图片

Celery 及异步任务的处理

我们现在的过程是,将用户的头像文件上传到本地服务器,然后从本地服务器上柴到七牛云,这个过程是很繁琐的一个过程,耗费时间,这种耗时的任务,就要使用到 Celery 及异步任务的处理

在这里插入图片描述
Celery 有两种任务,一种是异步任务,一种是定时操作,现在是要用到异步任务来处理耗时操作,产生异步任务,就需要任务执行单元Worker 来执行这些异步任务,任务执行单元Worker 和 异步任务之间,需要消息中间件进行关联,一般这个消息中间件使用redis
当产生异步任务时,使用redis去接收,然后任务执行单元进行监控,一旦发现有异步任务,就执行,执行完异步任务后进行存储,
在第一篇文档中,有一些简单的代码展示了Celery及异步任务
Django和Celery都是独立启动的,是两个独立的进程,需要配合使用
一般情况下,异步任务,都会独立放在一个文件夹中,在项目根目录下创建一个worker的包,然后在该文件夹下新建一个config .py文件
将第一篇文档中的代码复制进来
config .py

broker_url = 'redis://127.0.0.1:6379/0' # 异步任务存储的位置
broker_pool_limit = 200  # Borker 连接池, 默认是10

# 时区
timezone = 'Asia/Shanghai'
accept_content = ['pickle', 'json']  # 接受的序列化格式

task_serializer = 'pickle' # 任务序列化格式

result_backend = 'redis://127.0.0.1:6379/0' # 结果存储的位置
result_serializer = 'pickle'
result_cache_max = 10000  # 任务结果最大缓存数量
result_expires = 3600  # 任务过期时间

worker_redirect_stdouts_level = 'INFO'

注意
Celery支持定时任务,比如要定时备份数据库,此时时区的选择应该注意,如果不是Shanghai,而是其他时区的时间,比如UTC时区,那么备份的时间就可能和实际要备份的时间不符

由于Django和Celery是两个独立的进程,Celery需要知道Django中有哪些任务是需要异步化的,所以需要进行一些整合
在worker包中的 init .py 文件中,加入下面的代码
init .py

import os
from celery import Celery
from worker import config

# 加载Django的配置和虚拟环境,使用Django的环境变量
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'swiper.settings')

# 完成Celery的创建和配置工作
# 声明celery_app,起名为swiper
celery_app = Celery('swiper')
# 加载config文件
celery_app.config_from_object(config)

# 自动发现任务
celery_app.autodiscover_tasks()

将文件上传到本地和上传到七牛云异步化

在logic .py文件中新建一个async_upload_avatar函数,实现将文件上传异步化,在async_upload_avatar函数中调用
上传到本地服务器的函数upload_avatar和上传到七牛云的函数upload_qiniuyun,
在async_upload_avatar函数加上装饰器@celery_app.task,声明为一个异步任务,

前面说过upload_avatar函数的作用是传入文件名称和文件,返回文件路径,upload_qiniuyun函数的作用是传入文件路径和文件名称,返回状态码

@celery_app.task
def async_upload_avatar(avatar):
    # 文件名称
    file_name = 'avatar-{}'.format(int(time.time()))
	# 传入文件名称和文件,返回文件路径
    file_path = upload_avatar(file_name, avatar)
	# 传入文件路径和文件名称,返回状态码
    upload_qiniuyun(file_name, file_path)

这样做之后,原来的apis .py文件中上传到本地服务器和七牛云这两个调用就可以注释了,直接调用async_upload_avatar方法,使用异步任务
在这里插入图片描述
异步化之后,就不需要在使用代码去确认是否上传成功,否则异步化就没有意义,还要通过代码确认的话,就要等待确定Celery是否成功,那么这样就变成同步了,毫无意义

上传成功后将文件进行保存,完善logic .py文件中的async_upload_avatar函数

@celery_app.task
def async_upload_avatar(user, avatar):
    """
    异步上传头像到七牛云
    :param avatar:
    :return:
    """
    file_name = 'avatar-{}'.format(int(time.time()))

    file_path = upload_avatar(file_name, avatar)

    ret = upload_qiniuyun(file_name, file_path)

    if ret:
    	# 云存储保存的文件的路径 七牛云网址+文件名
        user.avatar = urljoin(config.QN_HOST, file_name)
        user.save()

进行测试,在项目根目录下启动celery
在这里插入图片描述
使用Postman发送三次请求
在这里插入图片描述
可以看到上传时间很短
在这里插入图片描述
查看七牛云存储,此时多了三个文件

为了测试的完整性,需要从头到尾的测试,先模拟登陆,拿到个人信息,从后台拿到验证码
在这里插入图片描述
然后验证,此时头像文件的云存储地址就拿到了
在这里插入图片描述

客户端直接上传到七牛云

在真实工作中,把文件上传到本地服务器,再将文件上传到七牛云,这样太浪费资源了
可以直接通过客户端将文件上传到七牛云
在这里插入图片描述
首先,客户端要上传文件,先向服务器申请上传授权,然后服务器返回上传凭证
这个上传凭证,实质上就是token
在这里插入图片描述
客户端拿到上传凭证后,根据本身的SDK的上传方法(移动端是iOS和安卓,pc端是JavaScript),将文件上传到七牛云,然后七牛云将上传结果返回给客户端

还有更加严谨的流程,设置回调就是多了一个七牛云向业务服务器(公司本地)发送一个讯息的作用,表示xxx上传了什么东西
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值