【Django】文件上传以及celery的使用

上传文件、异步、初始化脚本

 面试题:
项目中的静态文件处理(JS/CSS/image)	自己在机房内优化的方法:1. Nginx/lighttpd(lighty-douban):Nginx 处理静态资源速度非常快,并且自身还带有缓存。2. 80: Nginx -> {server config} -> django:8080  -> Static : folders	 -> 云存储你了解CDN吗?能讲讲原理么?扩展:如何更换CDN上的图片?改名大法1. 请求加参数:1. abc.jpg2. abc.jpg?20191011111042asdflj23. abc.jpg?201910111110432. 改名1. abc_201910111042.jpg2. abc_md5.jpg

七牛云接入

  1. 注册七牛云账号
  2. 创建存储空间:Bucket -> 有独立的域名,可以访问
  3. 获取相关配置
    • AccessKey:从个人中心-密钥管理里获得
    • SecretKey:从个人中心-密钥管理里获得
    • Bucket_name:我们自己新建的存储空间的名字
    • Bucket_URL:建好的新存储空间的访问url
  4. 安装 qiniu SDK:pip install qiniu
  5. 根据接口文档进行接口封装
  6. 按照需要将上传、下载接口封装成异步任务
  7. 程序处理流程
    1. 服务端上传方式
      1. 用户图片先上传到我们的服务器上
      2. 然后,我们的程序再调用七牛云的api,将图片上传到七牛云
      3. 上传成功后,拼接 avatar 的图片 url 地址:
        1. 七牛云的Bucket_URL/filename,将 avatar 的图片 url 存入数据库
    2. 客户端直传
      1. 客户端图片直接上传到云服务
      2. 客户端将图片地址告诉服务端,服务端更新数据库
      3. 其实存在一个安全隐患
        1. 客户端先从服务端获取token,再上传

代码示例 使用了celery

#上传图片
def user_avatar(request):#1.存下来# 定义上传后保存的文件名file_name =f'avatar-{request.user.id}.jpg'# 上传后保存的路径file_path = f'{settings.BASE_DIR}/static/{file_name}'#接收上传文件内容f = request.FILES['avatar']with open(file_path,'wb+') as destination:for chunk in f.chunks():destination.write(chunk)print('save local ok.')user_id = request.user.id#delay很重要!!!upload_qiniu.delay(file_name, file_path, user_id)return  render_json('已经放入celery-redis队列中')#这一步用异步celery
@celery_app.task
def upload_qiniu(file_name, file_path, user_id):# 2.调用七牛云sdk上传# 需要填写你的 Access Key 和 Secret Key 需要修改 access_key = 'KXfx2ZiBP311HkZZ8l8JHCmqlqPTJCK2sraihexx'secret_key = 'pe5svTTUAJQoUPhppsf0Gg9wbEJiYahnRMAy1rxx'# 要上传的空间bucket_name = 'liu'# 要上传的域名bucket_domain = ' liu.s3-cn-south-1.qiniucs.com'# 构建鉴权对象q = Auth(access_key, secret_key, )token = q.upload_token(bucket_name, file_name, 3600)ret, info = put_file(token, file_name, file_path)print(info)#断言assert ret['key'] == file_nameassert ret['hash'] == etag(file_path)print('save qiniu ok.')avatar_url = f'{bucket_domain}/{file_name}'# 3.更新用户的avataruser = User.objects.get(id=user_id)# user = request.user # request 无法传 所以改为user_iduser.avatar = avatar_urluser.save()return  True

异步任务

Celery 及异步任务的处理

  1. 通用的异步框架的原理

    1. 核心队列:消息队列

    2. 客户端:异步端

    3. 生产者:消费者

    4. 发布者:订阅者

    5. 发送者:接收者

      [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-YFOxnBJs-1577967577874)(/Users/zebin/Pictures/markdown_assets/image-20200102152154116.png)]

    • 任务模块 Task:包含异步任务和定时任务. 其中, 异步任务通常在业务逻辑中被触发并发往任务队列, 而定时任务由 Celery Beat 进程周期性地将任务发往任务队列.

    • 消息中间件 Broker:代理Broker, 即为任务调度队列, 接收任务生产者发来的消息(即任务)更重要的智能是把海量的的消息缓冲住, 将任务存入队列。Celery 本身不提供队列服务, 官方推荐使用 RabbitMQ 和 Redis 等,或者干脆用云服务的消息队列服务:SQS

    • 任务执行单元 Worker:Worker 是执行任务的处理单元, 它实时监控消息队列, 获取队列中调度的任务, 并执行它.

    • 任务结果存储 Backend:Backend 用于存储任务的执行结果, 以供查询. 同消息中间件一样, 存储也可使用 RabbitMQ, Redis 和 MongoDB 等.

  2. 消息队列:

    1. MQ:Message Queue,(与服务器、存储、缓存、数据库同等重要,是现代互联网后台架构的基础组件)
    2. 作用:
      1. 异步:把没必要同步执行的程序,用消息队列暂存,然后用其他程序去异步执行,做到跨机器分散任务
      2. 解耦:有依赖关系的应用之间,用消息队列解除耦合
        1. A 和 B 两个业务有强耦合
        2. A B
      3. 削峰:把互联网的高峰请求,先缓冲下来,然后再慢慢的逐个处理
        1. 秒杀、团购的场景,用这种方式降低峰值请求
      4. 限流:
        1. 1000,每进来一个人 -1,每离开一个人 +1,
        2. 减到 0 ,就告诉后来者:人满了。
    3. 常见的消息队列:
      1. Redis,最简单
      2. Kafka,最适合做日志处理,单机几十万并发(每秒钟的请求)
      3. RabbitMQ,符合 MQ 标准的消息队列(每秒钟几万)
      4. RocketMQ,符合 MQ 标准的消息队列(每秒钟十几万)
  3. 安装 注意win10不支持celery4.3!!!!!!!!!!
    所以需要额外安装在这里插入图片描述

    pip install  celery[redis] 
    
  4. 创建实例

    import os
    from celery import Celeryfrom social import settings
    from worker import configos.environ.setdefault("DJANGO_SETTINGS_MODULE", "social.settings")celery_app = Celery('social')
    celery_app.config_from_object(config)
    celery_app.autodiscover_tasks()
  5. 常规配置

    broker_url = 'redis://127.0.0.1:6379/0'
    broker_pool_limit = 1000  # Borker 连接池, 默认是10timezone = 'Asia/Shanghai'
    accept_content = ['pickle', 'json']task_serializer = 'pickle'
    result_expires = 3600  # 任务过期时间result_backend = 'redis://127.0.0.1:6379/1'
    result_serializer = 'pickle'
    result_cache_max = 10000  # 任务结果最大缓存数量worker_redirect_stdouts_level = 'INFO'
    
  6. 启动 Worker

Linux / mac下:
celery worker -A worker --loglevel=info

win:
celery worker -A worker --loglevel=info -P eventlet

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/455966.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Android 查看每个应用的最大可用内存

http://blog.csdn.net/vshuang/article/details/39647167 Android 内存管理 &Memory Leak & OOM 分析 单个应用可用的最大内存 Android设备出厂以后,java虚拟机对单个应用的最大内存分配就确定下来了,超出这个值就会OOM。这个属性值是定义在…

分析一段H264视频数据

分析一段H264视频数据 Posted on 2007-05-31 09:42 vcommon 阅读(1968) 评论(8) 编辑 收藏 引用 分析 00 00 00 01 67 42 00 1E 99 A0 B1 31 00 00 00 01 H264的数据流分为两种,一种是NAL UNIT stream(RTP),一种是 bits stream, 两者可以互相转换。我们分析的这个…

springboot springmvc mybatis_12道重点的Spring Boot面试题,帮你整理好了!

今天跟大家分享下SpringBoot常见面试题的知识。最新2020整理收集的一些面试题(都整理成文档),有很多干货,包含mysql,netty,spring,线程,spring cloud等详细讲解,也有详细…

【数据分析】快速获取微博用户数据,图片,视频

功能输出实例运行环境使用说明 下载脚本安装依赖程序设置设置数据库(可选)运行脚本按需求修改脚本(可选) 如何获取user_id添加cookie与不添加cookie的区别(可选)如何获取cookie(可选&#xff09…

“云计算”越来越重要 但更重要的是“云安全”

据Gartner公司的预测,云安全服务业务继续保持强劲,2017年最终将达到59亿美元的规模,比2016年上涨了21%。 云安全服务市场的增长速度将超过整体信息安全市场。Gartner表示,电子邮件的安全性,网络安全和身份识…

H.264的两个概念:DC系数和AC系数。 MV预测过程详解(附图)

在做熵编码之前,先明确两个概念:DC系数和AC系数。 量化后得到的仍是64个系数,量化并没有改变系数的性质。大家知到DCT变换是将数据域从时(空)域变换到频域,在频域平面上变换系数是二维频域变量u和v的函数。…

1028. List Sorting (25)

题目链接:http://www.patest.cn/contests/pat-a-practise/1028 题目: 1028. List Sorting (25) 时间限制200 ms内存限制65536 kB代码长度限制16000 B判题程序Standard作者CHEN, YueExcel can sort records according to any column. Now you are suppose…

【后端开发】分析抖音后台架构

最后分享抖音美女爬虫 https://github.com/wangshub/Douyin-Bot

看日本如何用IoT打造智能工厂

在技术、市场、政策等方面因素的推动下,全球正在掀起一股智能制造的热潮,越来越多的国家大力推进智能工厂的建设。有机构预测,未来五年智能工厂领域的投资将促进生产力增长27%,预计到2022年年底,21%的工厂将会成为智能…

c++ 测试串口速率_纳米软件案例之电流控制测试系统

项目背景西安某机电研究所电流控制测试系统软件需要用记录仪设置采样速率对电流数据进行采集,并能够进行数据实时显示、保存。为更好的分析实验现象,需要历史测试数据可查询并显示。目前采用的传统的手动测试,测试操作繁杂。数据保存困难&…

【Sublime】使用 Sublime 工具时运行python文件

使用 Sublime 工具时报Decode error - output not utf-8解决办法 在菜单中tools中第四项编译系统 内最后一项增添新的编译系统 自动新建 Python.sublime-build文件,并添加"encoding":"cp936"这一行,保存即可 使用python2 则注释encoding改为utf-8 {&quo…

【python】有意思的python小项目GitHub地址汇总

Licence_plate_recognize 车牌识别 Djang-Stu 基于python的Django框架学生信息管理系统 sklearn-machine-learning 数据分析-机器学习-深度学习【个人学习笔记】 movie_analysis 对电影影评分析生成词云 spider_doubanTOP 爬取豆瓣电影top250/爬取豆瓣图书top250 yuyin_re…

R 包的安装,使用,更新

R包的使用方法 包就是提供了种类繁多的函数,当然还有它的一些数据集,可以使用这些函数来操作这些数据集,来学习使用。 library(),当前的工作环境里,可以使用的包 包的帮助文档:help(package"包名"…

nginx 电子书_13本免费的电子书,拿走,不谢

傻白甜程序员13本电子书的清单01《PyTorch官方教程中文版》傻白甜程序员中,后台回复“pytorch”获取02《Think Python》傻白甜程序员中,后台回复“ThinkPython”获取03《走向分布式》傻白甜程序员中,后台回复“分布式”获取04《Nginx教程&…

Redis数据类型:字符串

2019独角兽企业重金招聘Python工程师标准>>> 概要 字符串类型是Redis最基本的数据类型,能够存储任何形式的字符串,单个健值最大能够存放512兆的数据,据传将来会放开512M的限制。 命令 设置值:set foo bar 获取值&#…

【docker】docker虚拟容器的使用大全

Docker容器详解 Docker是基于Go语言开发的开源应用容器引擎,遵从Apache Licence 2.0协议,可以让开发者打包应用以及应用的依赖包到一个可移植的容器中,然后发布到各种发行版本的Linux系统上。 Docker简介 软件开发中最为麻烦的事情可能就是…

【树莓派】修改树莓派盒子MAC地址

用树莓派盒子,在某些客户方实施过程中,不同客户的网络环境对树莓派盒子的要求不同,网络管理配置要求MAC地址和IP绑定。 一种情况下,查询盒子的MAC地址,添加到网络管理的路由规则中即可; 另一种情况下&#…

编程随想 关系图_IT什么岗位比较好找工作?一张金字塔图就能明白

IT(Internet Technology)互联网技术是指在计算机技术的基础上开发建立的一种信息技术。IT行业这些年一直很火爆, 对于IT就业岗位的选择一直也都是热门话题。一、IT人才总体供需金字塔型人才需求和市场供应关系图:人才供需图一般IT 行业供需关系可以比喻为…

诺基亚收购了阿朗:那与 TCL 的“阿尔卡特”品牌授权协议到期后咱办?

在被诺基亚收购之后,“阿尔卡特-朗讯”的牌子算是被这家芬兰公司收入囊中。尴尬的是,TCL 很早就获得了“阿尔卡特”这个智能手机品牌的授权。当然,对于因为错抱了微软 Windows Phone 这条大腿、以致于多年后再借着 HMD Global 重返 Android 智…

python编辑器_没有人比它更懂少儿编程,慧编程Python'吮指编辑器'

咳咳!大家好,我是偶尔写文章的康康老师。今天跟大家介绍的是慧编程家的,睡在Scratch上铺的兄弟——慧编程Python编辑器。这是一款集才华和颜值为一体的吮指编辑器!忘记肯德基,你的手指应该为编程而生!话不多…