Sfoglia il codice sorgente

新增OCI对象存储,预认证请求API

zhangdongming 1 anno fa
parent
commit
ae353f95e2

+ 18 - 0
Ansjer/cn_config/config_formal.py

@@ -140,3 +140,21 @@ APNS_CONFIG = {
         'pem_path': 'Ansjer/file/apns_pem/commissionf.pem',
     }
 }
+
+OCI_CONFIG = {
+    'us': {
+        'user': 'ocid1.user.oc1..aaaaaaaa63vtn64izdujrghlfby6xrlrrdce4yldtnjm7tmqzoc5i2b36s5q',
+        'fingerprint': '09:ff:f4:fa:64:bd:7b:72:64:67:5e:9a:ba:01:68:7b',
+        'tenancy': 'ocid1.tenancy.oc1..aaaaaaaaemreyqoegf4wbegfzetg63bwvzxa7ahfptbziexslzfmc7gnuwmq',
+        'region': 'us-phoenix-1',
+        'key_file': 'Ansjer/file/oci_pem/servers@ansjer.com_2023-12-20T07_21_33.069Z.pem'
+    },
+    'eur': {
+        'user': 'ocid1.user.oc1..aaaaaaaa63vtn64izdujrghlfby6xrlrrdce4yldtnjm7tmqzoc5i2b36s5q',
+        'fingerprint': '09:ff:f4:fa:64:bd:7b:72:64:67:5e:9a:ba:01:68:7b',
+        'tenancy': 'ocid1.tenancy.oc1..aaaaaaaaemreyqoegf4wbegfzetg63bwvzxa7ahfptbziexslzfmc7gnuwmq',
+        'region': 'uk-london-1',
+        'key_file': 'Ansjer/file/oci_pem/servers@ansjer.com_2023-12-20T07_21_33.069Z.pem'
+    }
+}
+OCI_NAMESPACE_NAME = 'cnmlmfa4fooi'

+ 18 - 0
Ansjer/cn_config/config_test.py

@@ -149,3 +149,21 @@ APNS_CONFIG = {
         'pem_path': 'Ansjer/file/apns_pem/commissionf-dev.pem',
     }
 }
+
+OCI_CONFIG = {
+    'us': {
+        'user': 'ocid1.user.oc1..aaaaaaaa63vtn64izdujrghlfby6xrlrrdce4yldtnjm7tmqzoc5i2b36s5q',
+        'fingerprint': '09:ff:f4:fa:64:bd:7b:72:64:67:5e:9a:ba:01:68:7b',
+        'tenancy': 'ocid1.tenancy.oc1..aaaaaaaaemreyqoegf4wbegfzetg63bwvzxa7ahfptbziexslzfmc7gnuwmq',
+        'region': 'us-phoenix-1',
+        'key_file': 'Ansjer/file/oci_pem/servers@ansjer.com_2023-12-20T07_21_33.069Z.pem'
+    },
+    'eur': {
+        'user': 'ocid1.user.oc1..aaaaaaaa63vtn64izdujrghlfby6xrlrrdce4yldtnjm7tmqzoc5i2b36s5q',
+        'fingerprint': '09:ff:f4:fa:64:bd:7b:72:64:67:5e:9a:ba:01:68:7b',
+        'tenancy': 'ocid1.tenancy.oc1..aaaaaaaaemreyqoegf4wbegfzetg63bwvzxa7ahfptbziexslzfmc7gnuwmq',
+        'region': 'uk-london-1',
+        'key_file': 'Ansjer/file/oci_pem/servers@ansjer.com_2023-12-20T07_21_33.069Z.pem'
+    }
+}
+OCI_NAMESPACE_NAME = 'cnmlmfa4fooi'

+ 18 - 0
Ansjer/eur_config/config_formal.py

@@ -140,3 +140,21 @@ APNS_CONFIG = {
         'pem_path': 'Ansjer/file/apns_pem/commissionf.pem',
     }
 }
+
+OCI_CONFIG = {
+    'us': {
+        'user': 'ocid1.user.oc1..aaaaaaaa63vtn64izdujrghlfby6xrlrrdce4yldtnjm7tmqzoc5i2b36s5q',
+        'fingerprint': '09:ff:f4:fa:64:bd:7b:72:64:67:5e:9a:ba:01:68:7b',
+        'tenancy': 'ocid1.tenancy.oc1..aaaaaaaaemreyqoegf4wbegfzetg63bwvzxa7ahfptbziexslzfmc7gnuwmq',
+        'region': 'us-phoenix-1',
+        'key_file': 'Ansjer/file/oci_pem/servers@ansjer.com_2023-12-20T07_21_33.069Z.pem'
+    },
+    'eur': {
+        'user': 'ocid1.user.oc1..aaaaaaaa63vtn64izdujrghlfby6xrlrrdce4yldtnjm7tmqzoc5i2b36s5q',
+        'fingerprint': '09:ff:f4:fa:64:bd:7b:72:64:67:5e:9a:ba:01:68:7b',
+        'tenancy': 'ocid1.tenancy.oc1..aaaaaaaaemreyqoegf4wbegfzetg63bwvzxa7ahfptbziexslzfmc7gnuwmq',
+        'region': 'uk-london-1',
+        'key_file': 'Ansjer/file/oci_pem/servers@ansjer.com_2023-12-20T07_21_33.069Z.pem'
+    }
+}
+OCI_NAMESPACE_NAME = 'cnmlmfa4fooi'

+ 28 - 0
Ansjer/file/oci_pem/servers@ansjer.com_2023-12-20T07_21_33.069Z.pem

@@ -0,0 +1,28 @@
+-----BEGIN PRIVATE KEY-----
+MIIEvAIBADANBgkqhkiG9w0BAQEFAASCBKYwggSiAgEAAoIBAQCRP0y7XdQ04WV7
+pMGtdCMx5Kdq+NIBzCNSbn4sEzjsAGnmqNuJYLYDtKZaWZp2xwq3+0EoRiHkN+P9
+Jrzb5MplbAzGEDWMevdYdqCxPL0H+KIEd2Zy7e3npYUipQ56astPq/9HytwvfbsL
+5ED8/csRqyPy8/JfuRlQ/i7XhhAG7HNx+hEVaiJLhfi0Y7IYX5+Zx4040fmDybfE
+J+IGB0qYNm/OfPIK8x8lr3RcOla86nFPrkgbxQOW1c0hbZ5NYILBJuzhCDsiU62A
+3o557ur8Tr2xAeS3ZVtW1yzbqwZwMyRtN0Anl3inVrSyDgXcEjWlckCi24OVnu2F
+QAd1d4ujAgMBAAECggEAClQyjDZ5c0M+GMNYJJIYOKGWiERmhssyDdger9q0FxBW
+d5k1d3kBqJTNqaoqklzINdovwYHvQg/5bhS1pHuKKxk6dVFMxY8vDMLu3XvAw5La
+TrABAJZL70e1hoevVmRGzgUgs8XIz7XEue1C89rGeJyvg0T2zPjYRIq24Qu/Ewbd
+JvVmjz4nAe28VjgEwzOnrPFkykT9YojUF1Bl26dJBj+oVk+O6Jf74TMhoT9O/B35
+VGDypqm2qyQQ9ra8myNKmTOCpi1RiK433k6RRCywyf6o+Lehot31eFFO6caIayVG
+j2aWe5N2gaWBPGeioFInKXqkw4tjLafWb3oEDJpAdQKBgQDD9CY8M9K3GQekE0Fb
+dh6a6Aza47WXdoOP/wnO+w3DsaqL42ZCp5/L3D3LtNBJiHXQZhXTuciV5qEtjszt
+XquXYJqyz29A7SNLOXLilvjPq71qWzJF6ViWcHBjX1R/7XqJkK0FuaJWaQFJ5uvS
+kEw55IrKnJ8DQ4m1ZJECn4nWLwKBgQC9wWpkmNNOTLyNJ5Ukf5IE2onL3aaa7iUG
+nLCXCUOXBUUGt9FE9As0PdNjXeTqqH80mWIEgyTBkvFNG5yGwNiVVIMd4Sa9Sm7W
+GND1NFeU3TDJ00rV9FSnVSbrJywi8NEst7qZqy4CS7xjr1+qP6xqIKhHS9n4+K8S
+idlsWB94zQKBgFUv7+teMC3vULYQtOoZGMcJOIV0Vv6IxDs2icIUvHAl7dmwu0Ug
+8ERE9Ax6B87f5y/5IWYRL1WTlOBkY0ySSpCdq8MukNQuA5jxWbOOJI7Lv6XcDaf9
+AMkuCn349JhE2m+xmLaTdDKSpb/GByFcH/dPFtNscWiO1PApzyzPxLF7AoGAMZ8M
+pXXZfBZREFCTjdHWa3KCqk8yLD2ubQY4n6aKiEmWfWVAUlnHPEgWqVt6a2rYqPab
+TTbGO+CjPVjFG+/+Mz7AcuXX7ZQzW8Vtj1G6vXECOyUH4t9b6842uTOrNQ/og1sg
+buL2yx7nCuJnj+vKuI4Fs29Adv0BO0XVF6ILyNkCgYAvP+bOLbPCS3u9Sw23e63t
+9EqeyNfR88KmQzVQGcP5yL3yUytQp5RrDqDdndP3uQa1TY6WQLKPqMh7sMWH9yWB
+6B/CudtduRWbWxLjXVN8Lhb9w7ORLRcY23xDQwdueOER3PHnp3UwaebHJ4+JXcdA
+KtygcG+9e3hWuUzyV/QdLQ==
+-----END PRIVATE KEY-----

+ 18 - 0
Ansjer/us_config/config_formal.py

@@ -140,3 +140,21 @@ APNS_CONFIG = {
         'pem_path': 'Ansjer/file/apns_pem/commissionf.pem',
     }
 }
+
+OCI_CONFIG = {
+    'us': {
+        'user': 'ocid1.user.oc1..aaaaaaaa63vtn64izdujrghlfby6xrlrrdce4yldtnjm7tmqzoc5i2b36s5q',
+        'fingerprint': '09:ff:f4:fa:64:bd:7b:72:64:67:5e:9a:ba:01:68:7b',
+        'tenancy': 'ocid1.tenancy.oc1..aaaaaaaaemreyqoegf4wbegfzetg63bwvzxa7ahfptbziexslzfmc7gnuwmq',
+        'region': 'us-phoenix-1',
+        'key_file': 'Ansjer/file/oci_pem/servers@ansjer.com_2023-12-20T07_21_33.069Z.pem'
+    },
+    'eur': {
+        'user': 'ocid1.user.oc1..aaaaaaaa63vtn64izdujrghlfby6xrlrrdce4yldtnjm7tmqzoc5i2b36s5q',
+        'fingerprint': '09:ff:f4:fa:64:bd:7b:72:64:67:5e:9a:ba:01:68:7b',
+        'tenancy': 'ocid1.tenancy.oc1..aaaaaaaaemreyqoegf4wbegfzetg63bwvzxa7ahfptbziexslzfmc7gnuwmq',
+        'region': 'uk-london-1',
+        'key_file': 'Ansjer/file/oci_pem/servers@ansjer.com_2023-12-20T07_21_33.069Z.pem'
+    }
+}
+OCI_NAMESPACE_NAME = 'cnmlmfa4fooi'

+ 115 - 0
Object/OCIObjectStorage.py

@@ -0,0 +1,115 @@
+# -*- encoding: utf-8 -*-
+"""
+@File    : OCIObjectStorage.py
+@Time    : 2024/4/10 15:06
+@Author  : stephen
+@Email   : zhangdongming@asj6.wecom.work
+@Software: PyCharm
+"""
+
+import oci
+
+from Ansjer.config import OCI_CONFIG, OCI_NAMESPACE_NAME
+
+
+class OCIObjectStorage:
+
+    # Create a default oci_config using DEFAULT profile in default location
+    # Refer to
+    # https://docs.cloud.oracle.com/en-us/iaas/Content/API/Concepts/sdkconfig.htm#SDK_and_CLI_Configuration_File
+    # for more info
+
+    def __init__(self, region):
+        # Initialize service client with default oci_config file
+        self.object_storage_client = oci.object_storage.ObjectStorageClient(OCI_CONFIG[region])
+
+    def create_ereauthenticated_request(self, bucket_name, name, object_name, time_expires):
+        """
+        创建特定于桶的预认证请求。
+        api:https://docs.oracle.com/en-us/iaas/api/#/en/objectstorage/20160918/PreauthenticatedRequest/CreatePreauthenticatedRequest
+        @param bucket_name: 存储桶名称
+        @param name: 请求名称 是创建的预授权链接的名称,是方便管理用的,不会影响功能。比如对每个桶分别创建链接,如果要删除或者查看,可以根据name看出来是对哪个桶的链接。
+        @param object_name: 对象名
+        @param time_expires: 失效时间 需要datetime类型格式 例如:datetime.utcnow() + timedelta(minutes=30)
+        @return: 预认证请求URL
+        """
+        try:
+            object_storage_client = self.object_storage_client
+
+            # Send the request to service, some parameters are not required, see API
+            # doc for more info
+            response = object_storage_client.create_preauthenticated_request(
+                namespace_name=OCI_NAMESPACE_NAME,
+                bucket_name=bucket_name,
+                create_preauthenticated_request_details=oci.object_storage.models.CreatePreauthenticatedRequestDetails(
+                    name=name,
+                    access_type="AnyObjectWrite",
+                    time_expires=time_expires,
+                    bucket_listing_action="Deny",
+                    object_name=object_name))
+
+            assert response.status == 200
+            return response.data
+
+        except Exception as e:
+            print(repr(e))
+            return None
+
+    def get_preauthenticated_request_url(self, bucket_name, name, object_name, time_expires):
+        """
+        获取指定对象预认证请求URL。
+        @param bucket_name: 存储桶名称
+        @param name: 请求名称 是创建的预授权链接的名称,是方便管理用的,不会影响功能。比如对每个桶分别创建链接,如果要删除或者查看,可以根据name看出来是对哪个桶的链接。
+        @param object_name: 对象名
+        @param time_expires: 失效时间 需要datetime类型格式 例如:datetime.utcnow() + timedelta(minutes=30)
+        @return: 预认证请求URL
+        """
+        try:
+            object_storage_client = self.object_storage_client
+            # 创建预认证请求
+            response = object_storage_client.create_preauthenticated_request(
+                namespace_name=OCI_NAMESPACE_NAME,
+                bucket_name=bucket_name,
+                create_preauthenticated_request_details=oci.object_storage.models.CreatePreauthenticatedRequestDetails(
+                    name=name,
+                    object_name=object_name,
+                    access_type="ObjectRead",
+                    time_expires=time_expires
+                )
+            )
+
+            assert response.status == 200
+            print(response.data)
+            return response.data
+
+        except Exception as e:
+            print(repr(e))
+            return None
+
+    def put_object(self, bucket_name, object_name, obj, content_type=None):
+        """
+        上传对象
+        @param bucket_name: 存储桶名称
+        @param object_name: 对象名
+        @param obj: 数据内容
+        @param content_type: 文件类型
+        @return: 可访问对象URL
+        """
+        try:
+            object_storage_client = self.object_storage_client
+
+            # 发送上传请求
+            put_object_response = object_storage_client.put_object(
+                namespace_name=OCI_NAMESPACE_NAME,
+                bucket_name=bucket_name,
+                object_name=object_name,
+                put_object_body=obj,
+                content_type=content_type
+            )
+
+            # 打印响应头信息
+            assert put_object_response.status == 200
+        except Exception as e:
+            print(repr(e))
+            return None
+

+ 2 - 1
requirements.txt

@@ -84,4 +84,5 @@ alibabacloud_green20220302==1.0.8
 django-apscheduler==0.6.2
 geoip2==4.7.0
 celery==5.3.6
-django-celery-beat==2.6.0
+django-celery-beat==2.6.0
+oci~=2.125.2