django drf 反序列化上传图片
Posted u-damowang1
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了django drf 反序列化上传图片相关的知识,希望对你有一定的参考价值。
- settings.py
#上传图片的类型 ALLOWED_IMG_TYPE = [‘jpg‘,‘png‘,‘PNG‘] #上传图片的地址 UPLOAD_ADDRESS = ‘static/upload/‘ STATIC_URL = ‘/static/‘ #配置静态文件夹 STATICFILES_DIRS = [ os.path.join(BASE_DIR,‘static‘), ]
- urls.py (二级路由)
from django.urls import path from . import views #二级路由 urlpatterns = [ path(‘goods/‘, views.GoodsView.as_view()), ]
- serializers.py
#商品的反序列化 class GoodUnSerializer(serializers.Serializer): #商品名称约束 name = serializers.CharField(max_length=32) #商品价格约束 price = serializers.DecimalField(max_digits=9,decimal_places=2) #商品分类约束 cate_id = serializers.IntegerField() #商品图片约束 img = serializers.CharField(max_length=255) def create(self, validated_data): #将获取的字典类型打散 return models.Goods.objects.create(**validated_data)
- views.py (字段name,price等可以写约束条件,这里就简单的给图片做一个约束)
#商品 class GoodsView(APIView): def post(self, request): name = request.POST.get(‘name‘, ‘‘).strip() price = request.POST.get(‘price‘, 0) cate_id = request.POST.get(‘cate_id‘) data = { ‘name‘:name, ‘price‘:price, ‘cate_id‘:cate_id } img = request.FILES.get(‘img‘) if img: #获取后缀名 ext = img.name.split(‘.‘)[-1] #如果上传图片的后缀名不在配置的后缀名里返回格式不允许 if ext not in settings.ALLOWED_IMG_TYPE: return Response({ "status":205, "msg":"格式不允许", "data":‘‘ }) # path = ‘‘ #新的文件名 newfielname = datetime.now().strftime(‘%Y%m%d%H%M%S‘) + str(random.randint(10000,99999)) + ‘.‘ + ext #采用时间和随机数 path = settings.UPLOAD_ADDRESS + newfielname with open(path,‘wb‘) as f: #二进制写入 for i in img.chunks(): f.write(i) data[‘img‘] = newfielname #入库反序列化添加 obj = GoodUnSerializer(data=data) if obj.is_valid(): obj.save() print(obj.errors) return Response({ ‘status‘:200, ‘msg‘:‘添加成功‘, ‘data‘:‘‘ }) return Response({ ‘status‘:201, ‘msg‘:‘添加失败‘, ‘data‘:‘‘ })
- 测试
- 不成功的
由于之前限制图片的后缀名,所以jfif格式上传不成功
-
- 来一个格式允许的吧
以上是关于django drf 反序列化上传图片的主要内容,如果未能解决你的问题,请参考以下文章