Sfoglia il codice sorgente

又后端上传文件到s3

peng 2 anni fa
parent
commit
eac8b74704
4 ha cambiato i file con 68 aggiunte e 49 eliminazioni
  1. 0 1
      VSeesResourceWeb/urls.py
  2. 25 0
      background/author.py
  3. 0 26
      background/serializers.py
  4. 43 22
      background/views.py

+ 0 - 1
VSeesResourceWeb/urls.py

@@ -27,7 +27,6 @@ router.register(r'upgradeFirmwareInfo', UpgradeFirmwareInfoSet)
 
 urlpatterns = [
     # path('admin/', admin.site.urls),
-    path('getUploadUrl/', GetUploadUrlView.as_view()),
     re_path(r'^vsees/(?P<operation>.*)', WechatLoginView.as_view()),
     url(r'^', include(router.urls)),
 ]

+ 25 - 0
background/author.py

@@ -0,0 +1,25 @@
+from rest_framework.authentication import BaseAuthentication
+from rest_framework.exceptions import AuthenticationFailed
+
+from background.Object import TokenObject
+from background.models import WechatUserInfo
+
+
+class MyAuthentication(BaseAuthentication):
+    def authenticate(self, request):
+        if request.method in ["GET", "POST", "PUT", "DELETE"]:
+            token_obj = request.META.get('HTTP_AUTHORIZATION')
+            if not token_obj:
+                raise AuthenticationFailed('缺少token')
+            print(token_obj)
+            token = TokenObject(token_obj)
+            if token.code != 0:
+                raise AuthenticationFailed('token无效')
+            user_id = token.userID
+            user_name = token.user
+            wechat_user = WechatUserInfo.objects.filter(user_id=user_id, name=user_name, status=1)
+            if not wechat_user.exists():
+                raise AuthenticationFailed('token无效')
+            return user_id, user_name
+        else:
+            return None, None

+ 0 - 26
background/serializers.py

@@ -58,34 +58,8 @@ class QuickStartInfoSerializer(ModelSerializer):
         model = QuickStartInfo
         fields = '__all__'
 
-    def create(self, validated_data):
-        link = validated_data.get('link')
-        validated_data['link'] = 'https://ansjerfilemanager.s3.amazonaws.com/vsees/quick_start_file/{}'.format(link)
-        video_qs = QuickStartInfo.objects.create(**validated_data)
-        return video_qs
-
-    def update(self, instance, validated_data):
-        link = 'https://ansjerfilemanager.s3.amazonaws.com/vsees/quick_start_file/{}'.format(validated_data.get('link'))
-        instance.link = link
-        instance.save()
-        return instance
-
 
 class UpgradeFirmwareInfoSerializer(ModelSerializer):
     class Meta:
         model = UpgradeFirmwareInfo
         fields = '__all__'
-
-    def create(self, validated_data):
-        link = validated_data.get('link')
-        validated_data['link'] = 'https://ansjerfilemanager.s3.amazonaws.com/vsees/upgrade_firmware_file/{}'.format(
-            link)
-        video_qs = UpgradeFirmwareInfo.objects.create(**validated_data)
-        return video_qs
-
-    def update(self, instance, validated_data):
-        link = 'https://ansjerfilemanager.s3.amazonaws.com/vsees/upgrade_firmware_file/{}'.format(
-            validated_data.get('link'))
-        instance.link = link
-        instance.save()
-        return instance

+ 43 - 22
background/views.py

@@ -14,6 +14,9 @@ from background.serializers import ProductInfoSerializer, VideoInSerializer, Qui
 from background.models import ProductInfo, VideoInfo, QuickStartInfo, UpgradeFirmwareInfo, WechatUserInfo
 from rest_framework.response import Response
 
+s3_obj = AmazonS3Util()
+bucket = 'ansjerfilemanager'
+
 
 class ProductInfoSet(ModelViewSet):
     queryset = ProductInfo.objects.all()
@@ -34,34 +37,52 @@ class QuickStartInfoSet(ModelViewSet):
     serializer_class = QuickStartInfoSerializer
     filterset_fields = ['id', 'product_info_id', 'title']
 
+    def create(self, request, *args, **kwargs):
+        link = request.data.get('link')
+        file_key = 'vsees/quick_start_file/{}'.format(link)
+        s3_obj.upload_file_obj(bucket, file_key, link, extra_args={'ACL': 'public-read'})
+        request.data['link'] = 'https://ansjerfilemanager.s3.amazonaws.com/vsees/quick_start_file/{}'.format(link)
+        serializer = self.get_serializer(data=request.data)
+        serializer.is_valid(raise_exception=True)
+        self.perform_create(serializer)
+        return Response(serializer.data)
+
+    def update(self, request, *args, **kwargs):
+        link = request.data.get('link')
+        file_key = 'vsees/quick_start_file/{}'.format(link)
+        s3_obj.upload_file_obj(bucket, file_key, link, extra_args={'ACL': 'public-read'})
+        request.data['link'] = 'https://ansjerfilemanager.s3.amazonaws.com/vsees/quick_start_file/{}'.format(link)
+        serializer = self.get_serializer(data=request.data, instance=self.get_object())
+        serializer.is_valid(raise_exception=True)
+        self.perform_update(serializer)
+        return Response(serializer.data)
+
 
 class UpgradeFirmwareInfoSet(ModelViewSet):
     queryset = UpgradeFirmwareInfo.objects.all()
     serializer_class = UpgradeFirmwareInfoSerializer
     filterset_fields = ['id', 'product_info_id', 'title']
-    # authentication_classes = [MyAuthentication, ]
 
-
-class GetUploadUrlView(APIView):
-    def get(self, request):
-        file_name = request.GET.get('file_name', None)
-        file_type = request.GET.get('file_type', None)
-        if not all([file_name]):
-            return Response({'code': 444, 'result': {'error_msg': 'file_name参数有误'}})
-        try:
-            s3_obj = AmazonS3Util()
-            if file_type == '1':  # 说明书
-                key_name = 'vsees/quick_start_file/{file_name}'.format(file_name=file_name)
-            elif file_type == '2':  # 升级文件
-                key_name = 'vsees/upgrade_firmware_file/{file_name}'.format(file_name=file_name)
-            else:
-                return Response({'code': 444, 'result': {'error_msg': 'file_type参数有误'}})
-            bucket_name = 'ansjerfilemanager'
-            upload_url = s3_obj.generate_put_obj_url(bucket_name, key_name)
-            return Response({'code': 0, 'result': {'uploadUrl': upload_url}})
-        except Exception as e:
-            return Response(
-                {'code': 500, 'result': {'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e))}})
+    # authentication_classes = [MyAuthentication, ]
+    def create(self, request, *args, **kwargs):
+        link = request.data.get('link')
+        file_key = 'vsees/upgrade_firmware_file/{}'.format(link)
+        s3_obj.upload_file_obj(bucket, file_key, link, extra_args={'ACL': 'public-read'})
+        request.data['link'] = 'https://ansjerfilemanager.s3.amazonaws.com/vsees/upgrade_firmware_file/{}'.format(link)
+        serializer = self.get_serializer(data=request.data)
+        serializer.is_valid(raise_exception=True)
+        self.perform_create(serializer)
+        return Response(serializer.data)
+
+    def update(self, request, *args, **kwargs):
+        link = request.data.get('link')
+        file_key = 'vsees/upgrade_firmware_file/{}'.format(link)
+        s3_obj.upload_file_obj(bucket, file_key, link, extra_args={'ACL': 'public-read'})
+        request.data['link'] = 'https://ansjerfilemanager.s3.amazonaws.com/vsees/upgrade_firmware_file/{}'.format(link)
+        serializer = self.get_serializer(data=request.data, instance=self.get_object())
+        serializer.is_valid(raise_exception=True)
+        self.perform_update(serializer)
+        return Response(serializer.data)
 
 
 class WechatLoginView(APIView):