- 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格式上傳不成功
-
- 來一個格式允許的吧