保存图片数据

在保存数据之前我们需要先获取图片关联的sku的id

1、获取sku表id

接口分析

请求方式: GET /meiduo_admin/skus/simple/

# -------获取sku的id--------url(r'skus/simple/$', images.ImageView.as_view({'get': 'simple'})),

请求参数: 通过请求头传递jwt token数据。

返回数据: JSON

 [{"id": 1,"name": "Apple MacBook Pro 13.3英寸笔记本 银色"},{"id": 2,"name": "Apple MacBook Pro 13.3英寸笔记本 深灰色"},......]
返回值 类型 是否必须 说明
Id int sku商品id
name 数组 Sku商品名称

后端实现

from rest_framework.permissions import IsAdminUser
from rest_framework.viewsets import ModelViewSet
from meiduo_admin.serializers.images import ImageSeriazlier, SKUSeriazlier
from goods.models import SKUImage, SKU
from meiduo_admin.utils import UserPageNum
from rest_framework.response import Responseclass ImageView(ModelViewSet):# 图片序列化器serializer_class = ImageSeriazlier# 图片查询集queryset = SKUImage.objects.all()# 分页pagination_class = UserPageNumpermission_classes = [IsAdminUser]#  获取sku商品信息def simple(self, request):#  查询所有的sku商品data = SKU.objects.all()#  序列化操作返回ser = SKUSeriazlier(data, many=True)return Response(ser.data)

序列化器的定义

from goods.models import SKUclass SKUSeriazlier(serializers.ModelSerializer):class Meta:model=SKUfields=('id','name')

2、保存图片数据

接口分析

请求方式:POST /meiduo_admin/skus/images/

#  图片查询路由****************************
router = DefaultRouter()
router.register('skus/images', images.ImageView, base_name='images')
# print(router.urls)
urlpatterns += router.urls

请求参数: 通过请求头传递jwt token数据。

表单提交数据:"sku": "SKU商品id","image": "SKU商品图片"
参数 类型 是否必须 说明
sku str SKU商品id
image Fiel SKU商品图片

返回数据: JSON

 {"id": "图片id","sku": "SKU商品id","image": "图片地址"}
参数 类型 是否必须 说明
id Int 图片id
sku int SKU商品id
image str 图片地址

后端实现

在保存图片的同时,我们还需要异步生成新的详情页页面,这是我们需要定义异步任务

【后端人员修改图片后,执行静态页面更改图片时可能速度会慢一些,所以防止阻塞这儿要使用异步任务】

import os
from django.conf import settings
from django.shortcuts import renderfrom meiduo_mall.utils.categories import get_categories
from meiduo_mall.utils.breadcrumb import get_breadcrumb
from goods.models import SKU
from celery_tasks.main import app@app.task(name='get_detail_html')
def get_detail_html(sku_id):#  获取当前sku对象sku = SKU.objects.get(id=sku_id)# 分类数据categories = get_categories()# 获取面包屑导航breadcrumb = get_breadcrumb(sku.category)# 获取spuspu = sku.spu# 获取规格信息:sku===>spu==>specsspecs = spu.specs.order_by('id')# 查询所有的sku,如华为P10的所有库存商品skus = spu.skus.order_by('id')'''{选项:sku_id}说明:键的元组中,规格的索引是固定的示例数据如下:{(1,3):1,(2,3):2,(1,4):3,(2,4):4}'''sku_options = {}sku_option = []for sku1 in skus:infos = sku1.specs.order_by('spec_id')option_key = []for info in infos:option_key.append(info.option_id)# 获取当前商品的规格信息if sku.id == sku1.id:sku_option.append(info.option_id)sku_options[tuple(option_key)] = sku1.id# 遍历当前spu所有的规格specs_list = []for index, spec in enumerate(specs):option_list = []for option in spec.options.all():# 如果当前商品为蓝、64,则列表为[2,3]sku_option_temp = sku_option[:]# 替换对应索引的元素:规格的索引是固定的[1,3]sku_option_temp[index] = option.id# 为选项添加sku_id属性,用于在html中输出链接option.sku_id = sku_options.get(tuple(sku_option_temp), 0)# 添加选项对象option_list.append(option)# 为规格对象添加选项列表spec.option_list = option_list# 重新构造规格数据specs_list.append(spec)context = {'sku': sku,'categories': categories,'breadcrumb': breadcrumb,'category_id': sku.category_id,'spu': spu,'specs': specs_list}response = render(None, 'detail.html', context)file_name = os.path.join(settings.BASE_DIR, 'static/detail/%d.html' % sku.id)# 写文件with open(file_name, 'w') as f1:f1.write(response.content.decode())

视图代码

在settings中配置fastdfs文件路径:

#  指定fastdfs文件路径
FASTDFS_PATH = os.path.join(BASE_DIR, 'utils/fdfs/client.conf')

images.py

from rest_framework.permissions import IsAdminUser
from rest_framework.viewsets import ModelViewSet
from meiduo_admin.serializers.images import ImageSerializer, SKUSerializer
from goods.models import SKUImage, SKU
from meiduo_admin.utils import UserPageNum
from rest_framework.response import Response
from fdfs_client.client import Fdfs_client
from django.conf import settings
from celery_tasks.static_file.tasks import get_detail_htmlclass ImageView(ModelViewSet):# 图片序列化器serializer_class = ImageSerializer# 图片查询集queryset = SKUImage.objects.all()# 分页pagination_class = UserPageNum# permission_classes = [IsAdminUser]#  获取sku商品信息def simple(self, request):#  查询所有的sku商品data = SKU.objects.all()#  序列化操作返回ser = SKUSerializer(data, many=True)return Response(ser.data)# 重写拓展类的保存业务逻辑def create(self, request, *args, **kwargs):# 创建FastDFS连接对象client = Fdfs_client(settings.FASTDFS_PATH)# 获取前端传递的image文件data = request.FILES.get('image')# 上传图片到fastDFSres = client.upload_by_buffer(data.read())# 判断是否上传成功if res['Status'] != 'Upload successed.':return Response(status=403)# 获取上传后的路径image_url = res['Remote file_id']# 获取sku_idsku_id = request.data.get('sku')[0]# 保存图片img = SKUImage.objects.create(sku_id=sku_id, image=image_url)# 生成新的详情页页面get_detail_html.delay(img.sku.id)# 返回结果return Response({'id': img.id,'sku': sku_id,'image': img.image.url  # 这儿返回是完整的路由信息},status=201  # 前端需要接受201状态)

【上面的create方法可以封装到序列化器中的,具体操作可以看源码。其实这些代码在序列化器中写好后,这些代码是可以直接注释掉的,父类方法中已经提供了这些操作。在序列化器中是没有request属性的,可以使用self.context['request']代替】

修改后的代码:

序列化器:【视图中的create代码可以都注释掉了】

from rest_framework import serializers
from goods.models import SKUImage
from goods.models import SKU
from rest_framework.response import Response
from fdfs_client.client import Fdfs_client
from django.conf import settings
from celery_tasks.static_file.tasks import get_detail_htmlclass ImageSerializer(serializers.ModelSerializer):# 返回图片关联的sku的id值sku = serializers.PrimaryKeyRelatedField(read_only=True)class Meta:model = SKUImage# fields = ('sku', 'image', 'id')fields = '__all__'def create(self, validated_data):#  创建FastDFS连接对象client = Fdfs_client(settings.FASTDFS_PATH)#  获取前端传来的image文件data = self.context['request'].FILES.get('image')# data = request.data#  上传图片到fastDFSres = client.upload_by_buffer(data.read())#  判断是否上传成功if res['Status'] != 'Upload successed.':return Response(status=403)#  获取上传后的路径image_url = res['Remote file_id']#  获取sku_idsku_id = self.context['request'].data.get('sku')[0]#  保存图片img = SKUImage.objects.create(sku_id=sku_id, image=image_url)# 异步生成详情页静态页面get_detail_html.delay(img.sku.id)return img

注意事项:这儿可能不能直接安装fdfs-client,这儿可以使用提前准备好的安装包文件,pip install fdfs-client-py-master.zip

关于FastDFS客户端上传文件以及安装各个注意事件,查看博文:

https://blog.csdn.net/weixin_44799217/article/details/118463124

图片管理之保存图片数据相关推荐

  1. 图片管理之获取图片列表数据

    图片管理 在图片表中我们需要对图片数据进行增删改查操作,这时候我们可以借助于视图集中的ModelViewset来完成相应的操作 获取图片列表数据 接口分析 请求方式: GET /meiduo_admi ...

  2. 学成在线--23.课程图片管理(上传图片)

    文章目录 一. 需求分析 1). 需求分析 2). 图片上传流程 二. 创建文件系统服务工程 1). 工程目录结构 2). 项目依赖pom.xml 3). 配置文件application.yml 三. ...

  3. 二进制数据图片(bit-data-map): 一种通过图片的形式传递数据信息的方式

    二进制数据图片 前言 最近公司那台终端电脑的粘贴功能坏了, 连接远程想从里面拿一个文件出来, 试了好多种方法不顶用, 远程终端开了一堆程序也不能随便重启远程终端, 最终是关了一大堆不必要的应用, 又重 ...

  4. 拖拽批量上传图片如何保证 顺序_使用 Eagle 探索图片管理新边界

    现状在现实生活中,我们付出劳动或金钱来获取物品,随着时间喜欢的东西会越来越多,渐渐的会囤积物品,即使有些物品买回来可能用的次数屈指可数,也没有打算丢弃掉,总是想着将来会有派上用场的一天.抱着这样的心态 ...

  5. CMS之图片管理(3)

    现在要完成目录的编辑操作.因为目录的编辑只是改变目录名称,因而使用Cellediting插件就可完成工作. 根据书11.3.2节的示例,要完成这个不难,首先在目录树的定义中加入以下语句隐藏列标题: h ...

  6. 计算机视觉——利用openCV与Socket结合进行远程摄像头实时视频传输并保存图片数据

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言 一.TCP协议通信步骤 二.代码实现 1.客户端 2.服务端 三.IP设置方法 四.效果演示 前言 本文的内容是利用o ...

  7. 在Asp.NET Core中如何优雅的管理用户机密数据

    在Asp.NET Core中如何优雅的管理用户机密数据 背景 回顾 在软件开发过程中,使用配置文件来管理某些对应用程序运行中需要使用的参数是常见的作法. 在早期VB/VB.NET时代,经常使用.ini ...

  8. ExtJs十一(ExtJs Mvc图片管理之一)

    前言 图片管理要在两个地方使用:一是标签页内的图片管理,一是文章内容编辑时嵌套到插入图片的窗口内.因而,将图片管理做成一个扩展比较方便.当然,做成MVC模式也行,不争论,不讨论. 要记住,扩展要写在S ...

  9. 基于layui图片管理器

    页面展示效果(支持编辑,单选,多选) 页面 pictures.cshtml @model Web.Admin.Models.PicturesPage @{ Layout = null; } <! ...

最新文章

  1. “男医生,女护士?”消除偏见,Google有大招
  2. Python中的collections模块的相关练习
  3. 写了一个将VxWorks的shell打印输出到指定内存中的接口,可广泛用于CLI下的调试函数显示以及故障自动捕获等功能,稍作修改可以适合其它嵌入式OS...
  4. python 包介绍:osmnx
  5. 您的主机不满足在启用Hyper-V 或DeviceCredential Guard的情况下运行VMware player的最低要求
  6. Delphi:ADOConnection连接SQLServer自动断网问题解决
  7. ETL之Kettle
  8. OsharpNS轻量级.net core快速开发框架简明入门教程-基于Osharp实现自己的业务功能...
  9. linux rsync 目录同步,Linux rsync网站目录同步功能的实现
  10. Postgresql pg_dumppg_restore用法
  11. c语言入门经典+第5版+习题答案,《C语言入门经典(第5版)》—甲虎网一站式图书批发平台...
  12. 图书管理系统项目开发计划书
  13. 贴片二极管正负极如何区分
  14. 学计算机基础专业必备的书,大学计算机基础教程
  15. 动态规划:什么是动态规划?
  16. kill -9 进程 杀掉僵死进程
  17. oracle限定词,ORACLE诊断事件
  18. 基于Java-SQL sever实现人事管理系统-数据库课程设计(附源码)
  19. 8个独立站海外营销工具
  20. CorelDRAW X6和PhotoZoom在一起,会碰撞出什么样的火花?

热门文章

  1. 英伟达推出全球首个元宇宙平台,豪砸数亿是为什么?
  2. 谷歌提出纯 MLP 构成的视觉架构,无需卷积、注意力 !
  3. 98年“后浪”科学家,首次挑战图片翻转不变性假设,一作拿下CVPR最佳论文提名​...
  4. “刚毕业1年,做Python能挣多少?”网友:吹的不多..
  5. 利用 AssemblyAI 在 PyTorch 中建立端到端的语音识别模型
  6. 成为计算机视觉工程师的第一个月,我都学会了什么?
  7. 信息保留的二值神经网络IR-Net,落地性能和实用性俱佳 | CVPR 2020
  8. 当谈论迭代器时,我谈些什么?
  9. Python编写循环的两个建议 | 鹅厂实战
  10. 程序员春运抢票的正确姿势!