完成项目管理模块的接口测试

This commit is contained in:
sunyugang 2025-04-18 17:22:57 +08:00
parent 434e1af3e8
commit 7a9e571a96
16 changed files with 91 additions and 74 deletions

View File

@ -29,7 +29,6 @@ MONGO_DB_ENABLE = False
MONGO_DB_NAME = "kinit" MONGO_DB_NAME = "kinit"
MONGO_DB_URL = f"mongodb://kinit:123456@177.8.0.6:27017/?authSource={MONGO_DB_NAME}" MONGO_DB_URL = f"mongodb://kinit:123456@177.8.0.6:27017/?authSource={MONGO_DB_NAME}"
""" """
华为云对象存储OBS设置 华为云对象存储OBS设置
""" """
@ -47,10 +46,16 @@ HUAWEI_OBS = {
IP_PARSE_ENABLE = False IP_PARSE_ENABLE = False
IP_PARSE_TOKEN = "IP_PARSE_TOKEN" IP_PARSE_TOKEN = "IP_PARSE_TOKEN"
"""
datasets_url = f'D:\syg\yolov5\datasets' yolov5的各种文件保存地址
runs_url = f'D:\syg\yolov5\runs' images_url 原始图片保存地址
detect_url = f'D:\syg\yolov5\detect' datasets_url 文件集文件地址
yolo_url = f'D:\syg\workspace\aicheckv2\yolov5' runs_url 训练结果文件地址
detect_url 推理集合文件地址
images_url = f'D:\syg\images' yolo_url yolov5执行文件所在的文件路径
"""
images_url = r'D:\syg\images'
datasets_url = r'D:\syg\yolov5\datasets'
runs_url = r'D:\syg\yolov5\runs'
detect_url = r'D:\syg\yolov5\detect'
yolo_url = r'D:\syg\workspace\aicheckv2\yolov5'

View File

@ -28,7 +28,6 @@ MONGO_DB_ENABLE = False
MONGO_DB_NAME = "kinit" MONGO_DB_NAME = "kinit"
MONGO_DB_URL = f"mongodb://kinit:123456@177.8.0.6:27017/?authSource={MONGO_DB_NAME}" MONGO_DB_URL = f"mongodb://kinit:123456@177.8.0.6:27017/?authSource={MONGO_DB_NAME}"
""" """
华为云对象存储OBS设置 华为云对象存储OBS设置
""" """
@ -39,7 +38,6 @@ HUAWEI_OBS = {
"bucketName": "aicheckv2" "bucketName": "aicheckv2"
} }
""" """
获取IP地址归属地 获取IP地址归属地
文档https://user.ip138.com/ip/doc 文档https://user.ip138.com/ip/doc
@ -47,9 +45,16 @@ HUAWEI_OBS = {
IP_PARSE_ENABLE = False IP_PARSE_ENABLE = False
IP_PARSE_TOKEN = "IP_PARSE_TOKEN" IP_PARSE_TOKEN = "IP_PARSE_TOKEN"
"""
yolov5的各种文件保存地址
images_url 原始图片保存地址
datasets_url 待训练文件地址
runs_url 训练结果文件地址
detect_url 推理集合文件地址
yolo_url yolo执行文件所在的文件路径
"""
images_url = f'/home/aicheckv2/images'
datasets_url = f'/home/aicheckv2/yolov5/datasets' datasets_url = f'/home/aicheckv2/yolov5/datasets'
runs_url = f'/home/aicheckv2/yolov5/runs' runs_url = f'/home/aicheckv2/yolov5/runs'
detect_url = f'/home/aicheckv2/yolov5/detect' detect_url = f'/home/aicheckv2/yolov5/detect'
yolo_url = f'/home/aicheckv2/backend/yolov5' yolo_url = f'/home/aicheckv2/backend/yolov5'
images_url = f'/home/aicheckv2/images'

View File

@ -12,7 +12,7 @@ from . import schemas, models
from utils.random_utils import random_str from utils.random_utils import random_str
from utils import os_utils as os from utils import os_utils as os
from application.settings import detect_url from application.settings import detect_url
from utils.huawei_obs import ObsClient from utils.huawei_obs import MyObs
from utils import status from utils import status
from core.exception import CustomException from core.exception import CustomException
@ -76,6 +76,7 @@ class ProjectDetectFileDal(DalBase):
async def add_file(self, detect: models.ProjectDetect, files: list[UploadFile]): async def add_file(self, detect: models.ProjectDetect, files: list[UploadFile]):
images = [] images = []
obs = MyObs()
for file in files: for file in files:
image = models.ProjectDetectFile() image = models.ProjectDetectFile()
image.detect_id = detect.id image.detect_id = detect.id
@ -85,7 +86,7 @@ class ProjectDetectFileDal(DalBase):
image.image_url = path image.image_url = path
# 上传到obs # 上传到obs
object_key = detect.detect_no + '/' + file.filename object_key = detect.detect_no + '/' + file.filename
success, key, url = ObsClient.put_file(object_key=object_key, file_path=path) success, key, url = obs.put_file(object_key=object_key, file_path=path)
if success: if success:
image.object_key = object_key image.object_key = object_key
image.thumb_image_url = url image.thumb_image_url = url
@ -103,7 +104,7 @@ class ProjectDetectFileDal(DalBase):
file_urls.append(file.file_url) file_urls.append(file.file_url)
object_keys.append(file.object_key) object_keys.append(file.object_key)
os.delete_paths(file_urls) os.delete_paths(file_urls)
ObsClient.del_objects(object_keys) MyObs().del_objects(object_keys)
await self.delete_datas(ids, v_soft=False) await self.delete_datas(ids, v_soft=False)
class ProjectDetectLogDal(DalBase): class ProjectDetectLogDal(DalBase):

View File

@ -8,7 +8,7 @@
from . import schemas, models, params from . import schemas, models, params
from apps.vadmin.auth.utils.validation.auth import Auth from apps.vadmin.auth.utils.validation.auth import Auth
from utils import os_utils as os, random_utils as ru from utils import os_utils as os, random_utils as ru
from utils.huawei_obs import ObsClient from utils.huawei_obs import MyObs
from utils import status from utils import status
from core.exception import CustomException from core.exception import CustomException
from application.settings import datasets_url, runs_url, images_url from application.settings import datasets_url, runs_url, images_url
@ -169,6 +169,7 @@ class ProjectImageDal(DalBase):
上传项目图片 上传项目图片
""" """
image_models = [] image_models = []
obs = MyObs()
for file in files: for file in files:
image = models.ProjectImage() image = models.ProjectImage()
image.project_id = pro.id image.project_id = pro.id
@ -179,14 +180,14 @@ class ProjectImageDal(DalBase):
image.image_url = path image.image_url = path
# 上传图片到obs # 上传图片到obs
object_key = pro.project_no + '/' + img_type + '/' + file.filename object_key = pro.project_no + '/' + img_type + '/' + file.filename
success, key, url = ObsClient.put_file(object_key=object_key, file_path=path) success, key, url = obs.put_file(object_key=object_key, file_path=path)
if success: if success:
image.object_key = object_key image.object_key = object_key
image.thumb_image_url = url image.thumb_image_url = url
else: else:
raise CustomException("obs上传失败", code=status.HTTP_ERROR) raise CustomException("obs上传失败", code=status.HTTP_ERROR)
image_models.append(image) image_models.append(image)
await self.create_datas(datas=image_models) await self.create_models(datas=image_models)
return len(image_models) return len(image_models)
async def check_img_name(self, file_name: str, project_id: int, img_type: str): async def check_img_name(self, file_name: str, project_id: int, img_type: str):
@ -207,12 +208,12 @@ class ProjectImageDal(DalBase):
file_urls = [] file_urls = []
object_keys = [] object_keys = []
for img_id in ids: for img_id in ids:
image = self.get_data(data_id=img_id) image = await self.get_data(data_id=img_id)
if image: if image:
file_urls.append(image.image_url) file_urls.append(image.image_url)
object_keys.append(image.object_key) object_keys.append(image.object_key)
os.delete_file_if_exists(**file_urls) os.delete_file_if_exists(*file_urls)
ObsClient.del_objects(object_keys) MyObs().del_objects(object_keys)
await self.delete_datas(ids) await self.delete_datas(ids)
async def get_img_count( async def get_img_count(
@ -330,6 +331,11 @@ class ProjectImgLabelDal(DalBase):
v_order="asc", v_order="asc",
v_order_field="id") v_order_field="id")
async def del_img_label(self, label_ids: list[int]):
img_labels = self.get_datas(v_where=[self.model.label_id.in_(label_ids)])
img_label_ids = [i.id for i in img_labels]
self.delete_datas(ids=img_label_ids)
class ProjectImgLeaferDal(DalBase): class ProjectImgLeaferDal(DalBase):
""" """
@ -342,6 +348,10 @@ class ProjectImgLeaferDal(DalBase):
self.model = models.ProjectImgLeafer self.model = models.ProjectImgLeafer
self.schema = schemas.ProjectImgLeaferOut self.schema = schemas.ProjectImgLeaferOut
async def get_leafer(self, image_id: int):
img_label = self.get_data(v_where=[self.model.image_id == image_id])
return img_label.leafer
async def add_leafer(self, img_label_in: schemas.ProjectImgLeaferLabel): async def add_leafer(self, img_label_in: schemas.ProjectImgLeaferLabel):
# 先把历史数据都删掉,然后再保存 # 先把历史数据都删掉,然后再保存
image_id = img_label_in.image_id image_id = img_label_in.image_id

View File

@ -16,7 +16,7 @@ class ProjectImage(BaseModel):
project_id: Optional[int] = Field(..., description="项目id") project_id: Optional[int] = Field(..., description="项目id")
file_name: Optional[str] = Field(None, description="文件名称") file_name: Optional[str] = Field(None, description="文件名称")
thumb_image_url: Optional[str] = Field(None, description="图片在obs上的链接") thumb_image_url: Optional[str] = Field(None, description="图片在obs上的链接")
create_time: DatetimeStr create_datetime: DatetimeStr
model_config = ConfigDict(from_attributes=True) model_config = ConfigDict(from_attributes=True)
@ -26,7 +26,7 @@ class ProjectImageOut(BaseModel):
project_id: Optional[int] = Field(..., description="项目id") project_id: Optional[int] = Field(..., description="项目id")
file_name: Optional[str] = Field(None, description="文件名称") file_name: Optional[str] = Field(None, description="文件名称")
thumb_image_url: Optional[str] = Field(None, description="图片在obs上的链接") thumb_image_url: Optional[str] = Field(None, description="图片在obs上的链接")
create_time: DatetimeStr label_count: Optional[int] = Field(0, description="图片的标注数量")
label_count: Optional[int] create_datetime: DatetimeStr
model_config = ConfigDict(from_attributes=True) model_config = ConfigDict(from_attributes=True)

View File

@ -5,11 +5,11 @@
# @File : views.py # @File : views.py
# @IDE : PyCharm # @IDE : PyCharm
# @desc : 路由,项目信息管理,包括项目主体,项目图片,项目标签和图片的标注信息 # @desc : 路由,项目信息管理,包括项目主体,项目图片,项目标签和图片的标注信息
from utils.response import SuccessResponse, ErrorResponse
from . import params, schemas, crud, models
from core.dependencies import IdList
from typing import List from core.dependencies import IdList
from . import params, schemas, crud, models
from utils.response import SuccessResponse, ErrorResponse
from fastapi import APIRouter, Depends, UploadFile, Form from fastapi import APIRouter, Depends, UploadFile, Form
from apps.vadmin.auth.utils.current import FullAdminAuth from apps.vadmin.auth.utils.current import FullAdminAuth
from apps.vadmin.auth.utils.validation.auth import Auth from apps.vadmin.auth.utils.validation.auth import Auth
@ -60,12 +60,12 @@ async def del_project(
return SuccessResponse(msg="删除成功") return SuccessResponse(msg="删除成功")
@app.get("/label/{pro_id}", summary="查询标签列表") @app.get("/label/{project_id}", summary="查询标签列表")
async def label_list( async def label_list(
pro_id: int, project_id: int,
auth: Auth = Depends(FullAdminAuth()) auth: Auth = Depends(FullAdminAuth())
): ):
result = await crud.ProjectLabelDal(auth.db).get_datas(v_where=[models.ProjectLabel.project_id == pro_id], result = await crud.ProjectLabelDal(auth.db).get_datas(v_where=[models.ProjectLabel.project_id == project_id],
v_schema=schemas.ProjectLabel) v_schema=schemas.ProjectLabel)
return SuccessResponse(data=result) return SuccessResponse(data=result)
@ -101,8 +101,7 @@ async def delete_label(
): ):
# 删除标签信息,然后删除图片标签关联表 # 删除标签信息,然后删除图片标签关联表
await crud.ProjectLabelDal(auth.db).delete_datas(label_ids.ids) await crud.ProjectLabelDal(auth.db).delete_datas(label_ids.ids)
for label_id in label_ids.ids: await crud.ProjectImgLabelDal(auth.db).del_img_label(label_ids.ids)
await crud.ProjectImgLabelDal(auth.db).delete_datas(label_id=label_id)
return SuccessResponse(msg="删除成功") return SuccessResponse(msg="删除成功")
@ -111,7 +110,7 @@ async def project_pager(
param: params.ProjectImageParams = Depends(), param: params.ProjectImageParams = Depends(),
auth: Auth = Depends(FullAdminAuth()) auth: Auth = Depends(FullAdminAuth())
): ):
if param.limit: if param.limit > 0:
# 分页查询,关联一个标签数量 # 分页查询,关联一个标签数量
datas, count = await crud.ProjectImageDal(auth.db).img_page(param) datas, count = await crud.ProjectImageDal(auth.db).img_page(param)
return SuccessResponse(data=datas, count=count) return SuccessResponse(data=datas, count=count)
@ -124,7 +123,7 @@ async def project_pager(
@app.post("/img", summary="上传图片") @app.post("/img", summary="上传图片")
async def up_img( async def up_img(
project_id: int = Form(...), project_id: int = Form(...),
files: List[UploadFile] = Form(...), files: list[UploadFile] = Form(...),
img_type: str = Form(...), img_type: str = Form(...),
auth: Auth = Depends(FullAdminAuth()) auth: Auth = Depends(FullAdminAuth())
): ):
@ -155,8 +154,10 @@ async def add_img_label(
return SuccessResponse(msg="保存成功") return SuccessResponse(msg="保存成功")
@app.get("/img_label/{image_id}", summary="获取图片的标注信息")
async def get_img_label(
image_id: int,
auth: Auth = Depends(FullAdminAuth())
):
leafer = await crud.ProjectImgLeaferDal(auth.db).get_leafer(image_id)
return SuccessResponse(data=leafer)

View File

@ -18,7 +18,7 @@ from sqlalchemy import select, false, and_
from core.crud import DalBase from core.crud import DalBase
from sqlalchemy.ext.asyncio import AsyncSession from sqlalchemy.ext.asyncio import AsyncSession
from core.validator import vali_telephone from core.validator import vali_telephone
from utils.huawei_obs import ObsClient from utils.huawei_obs import MyObs
from utils.excel.import_manage import ImportManage, FieldType from utils.excel.import_manage import ImportManage, FieldType
from utils.excel.write_xlsx import WriteXlsx from utils.excel.write_xlsx import WriteXlsx
from utils.send_email import EmailSender from utils.send_email import EmailSender
@ -221,8 +221,6 @@ class UserDal(DalBase):
value = getattr(user, field, "") value = getattr(user, field, "")
if field == "is_active": if field == "is_active":
value = "可用" if value else "停用" value = "可用" if value else "停用"
elif field == "is_staff":
value = "" if value else ""
elif field == "gender": elif field == "gender":
result = list(filter(lambda i: i["value"] == value, options["gender_options"])) result = list(filter(lambda i: i["value"] == value, options["gender_options"]))
value = result[0]["label"] if result else "" value = result[0]["label"] if result else ""
@ -397,7 +395,7 @@ class UserDal(DalBase):
:param file: :param file:
:return: :return:
""" """
success, key, url = await ObsClient().put_object("avatar"+"/"+user.name+file.filename, file) success, key, url = MyObs().put_object("avatar"+"/"+user.name+file.filename, file)
user.avatar = url user.avatar = url
await self.flush(user) await self.flush(user)
return url return url

View File

@ -37,7 +37,6 @@ class VadminUser(BaseModel):
) )
last_ip: Mapped[str | None] = mapped_column(String(50), comment="最后一次登录IP") last_ip: Mapped[str | None] = mapped_column(String(50), comment="最后一次登录IP")
last_login: Mapped[datetime | None] = mapped_column(DateTime, comment="最近一次登录时间") last_login: Mapped[datetime | None] = mapped_column(DateTime, comment="最近一次登录时间")
is_staff: Mapped[bool] = mapped_column(Boolean, default=False, comment="是否为工作人员")
wx_server_openid: Mapped[str | None] = mapped_column(String(255), comment="服务端微信平台openid") wx_server_openid: Mapped[str | None] = mapped_column(String(255), comment="服务端微信平台openid")
is_wx_server_openid: Mapped[bool] = mapped_column(Boolean, default=False, comment="是否已有服务端微信平台openid") is_wx_server_openid: Mapped[bool] = mapped_column(Boolean, default=False, comment="是否已有服务端微信平台openid")

View File

@ -24,7 +24,6 @@ class UserParams(QueryParams):
telephone: str | None = Query(None, title="手机号"), telephone: str | None = Query(None, title="手机号"),
email: str | None = Query(None, title="邮箱"), email: str | None = Query(None, title="邮箱"),
is_active: bool | None = Query(None, title="是否可用"), is_active: bool | None = Query(None, title="是否可用"),
is_staff: bool | None = Query(None, title="是否为工作人员"),
params: Paging = Depends() params: Paging = Depends()
): ):
super().__init__(params) super().__init__(params)
@ -32,6 +31,5 @@ class UserParams(QueryParams):
self.telephone = ("like", telephone) self.telephone = ("like", telephone)
self.email = ("like", email) self.email = ("like", email)
self.is_active = is_active self.is_active = is_active
self.is_staff = is_staff

View File

@ -21,7 +21,6 @@ class User(BaseModel):
nickname: str | None = None nickname: str | None = None
avatar: str | None = None avatar: str | None = None
is_active: bool | None = True is_active: bool | None = True
is_staff: bool | None = True
gender: str | None = "0" gender: str | None = "0"
is_wx_server_openid: bool | None = False is_wx_server_openid: bool | None = False
@ -56,7 +55,6 @@ class UserUpdate(User):
nickname: str | None = None nickname: str | None = None
avatar: str | None = None avatar: str | None = None
is_active: bool | None = True is_active: bool | None = True
is_staff: bool | None = False
gender: str | None = "0" gender: str | None = "0"
role_ids: list[int] = [] role_ids: list[int] = []
dept_ids: list[int] = [] dept_ids: list[int] = []

View File

@ -103,8 +103,7 @@ class FullAdminAuth(AuthValidation):
telephone=telephone, telephone=telephone,
password=password, password=password,
v_return_none=True, v_return_none=True,
v_options=options, v_options=options
is_staff=True
) )
result = await self.validate_user(request, user, db, is_all=False) result = await self.validate_user(request, user, db, is_all=False)
permissions = self.get_user_permissions(user) permissions = self.get_user_permissions(user)

View File

@ -57,8 +57,6 @@ async def api_login_for_access_token(
raise CustomException(status_code=error_code, code=error_code, msg="手机号或密码错误") raise CustomException(status_code=error_code, code=error_code, msg="手机号或密码错误")
if not user.is_active: if not user.is_active:
raise CustomException(status_code=error_code, code=error_code, msg="此手机号已被冻结") raise CustomException(status_code=error_code, code=error_code, msg="此手机号已被冻结")
elif not user.is_staff:
raise CustomException(status_code=error_code, code=error_code, msg="此手机号无权限")
access_token = LoginManage.create_token({"sub": user.telephone, "password": user.password}) access_token = LoginManage.create_token({"sub": user.telephone, "password": user.password})
record = LoginForm(platform='2', method='0', telephone=data.username, password=data.password) record = LoginForm(platform='2', method='0', telephone=data.username, password=data.password)
resp = {"access_token": access_token, "token_type": "bearer"} resp = {"access_token": access_token, "token_type": "bearer"}

View File

@ -80,7 +80,7 @@ class LoginValidation:
await db.flush() await db.flush()
elif not user.is_active: elif not user.is_active:
self.result.msg = "此手机号已被冻结!" self.result.msg = "此手机号已被冻结!"
elif data.platform in ["0", "1"] and not user.is_staff: elif data.platform in ["0", "1"]:
self.result.msg = "此手机号无权限!" self.result.msg = "此手机号无权限!"
else: else:
if not DEMO and count: if not DEMO and count:

View File

@ -6,19 +6,14 @@
# @desc : 主要接口文件 # @desc : 主要接口文件
from redis.asyncio import Redis from redis.asyncio import Redis
from fastapi import APIRouter, Depends, Body, UploadFile, Form, Request from fastapi import APIRouter, Depends, Body
from motor.motor_asyncio import AsyncIOMotorDatabase from motor.motor_asyncio import AsyncIOMotorDatabase
from sqlalchemy.ext.asyncio import AsyncSession from core.database import redis_getter, mongo_getter
from application.settings import ALIYUN_OSS
from core.database import db_getter, redis_getter, mongo_getter
from utils.file.aliyun_oss import AliyunOSS, BucketConf
from utils.huawei_obs import ObsClient
from utils.file.file_manage import FileManage
from utils.response import SuccessResponse, ErrorResponse from utils.response import SuccessResponse, ErrorResponse
from utils.sms.code import CodeSMS from utils.sms.code import CodeSMS
from . import schemas, crud from . import schemas, crud
from core.dependencies import IdList from core.dependencies import IdList
from apps.vadmin.auth.utils.current import AllUserAuth, FullAdminAuth, OpenAuth from apps.vadmin.auth.utils.current import AllUserAuth, OpenAuth
from apps.vadmin.auth.utils.validation.auth import Auth from apps.vadmin.auth.utils.validation.auth import Auth
from .params import DictTypeParams, DictDetailParams, TaskParams from .params import DictTypeParams, DictDetailParams, TaskParams
from apps.vadmin.auth import crud as vadmin_auth_crud from apps.vadmin.auth import crud as vadmin_auth_crud

View File

@ -263,6 +263,16 @@ class DalBase:
await self.db.execute(insert(self.model), datas) await self.db.execute(insert(self.model), datas)
await self.db.flush() await self.db.flush()
async def create_models(self, datas: list[Any]) -> None:
"""
批量创建数据
SQLAlchemy 2.0 批量插入不支持 MySQL 返回值
https://docs.sqlalchemy.org/en/20/orm/queryguide/dml.html#getting-new-objects-with-returning
:param datas: model数组
"""
self.db.add_all(datas)
await self.db.flush()
async def put_data( async def put_data(
self, self,
data_id: int, data_id: int,

View File

@ -5,28 +5,28 @@ from obs import DeleteObjectsRequest
from obs import Object from obs import Object
class ObsClient: class MyObs:
def __int__(self): def __init__(self):
self.obsClient = ObsClient( self.obsClient = ObsClient(
access_key_id=HUAWEI_OBS['AccessKeyID'], access_key_id=HUAWEI_OBS['AccessKeyID'],
secret_access_key=HUAWEI_OBS['SecretAccessKey'], secret_access_key=HUAWEI_OBS['SecretAccessKey'],
server=HUAWEI_OBS["server"]) server=HUAWEI_OBS["server"])
async def put_file(self, objectKey: str, file_path: str): def put_file(self, object_key: str, file_path: str):
resp = await self.obsClient.putFile( resp = self.obsClient.putFile(
bucketName=HUAWEI_OBS["bucketName"], bucketName=HUAWEI_OBS["bucketName"],
objectKey=objectKey, objectKey=object_key,
file_path=file_path) file_path=file_path)
if resp.status < 300: if resp.status < 300:
print("objectKey", objectKey) print("objectKey", object_key)
print("url", resp.body.objectUrl) print("url", resp.body.objectUrl)
return True, objectKey, resp.body.objectUrl return True, object_key, resp.body.objectUrl
else: else:
return False, None, None return False, None, None
async def put_object(self, objectKey: str, file_content): def put_object(self, objectKey: str, file_content):
resp = await self.obsClient.put_object( resp = self.obsClient.put_object(
bucketName=HUAWEI_OBS["bucketName"], bucketName=HUAWEI_OBS["bucketName"],
objectKey=objectKey, objectKey=objectKey,
file_cotent=file_content) file_cotent=file_content)
@ -37,14 +37,14 @@ class ObsClient:
else: else:
return False, None, None return False, None, None
async def del_objects(self, object_keys: []): def del_objects(self, object_keys: []):
objects = [] objects = []
for object_key in object_keys: for object_key in object_keys:
object_one = Object(key=object_key, versionId=None) object_one = Object(key=object_key, versionId=None)
objects.append(object_one) objects.append(object_one)
encoding_type = 'url' encoding_type = 'url'
resp = await self.obsClient.deleteObjects( resp = self.obsClient.deleteObjects(
bucketName=HUAWEI_OBS["bucketName"], bucketName=HUAWEI_OBS["bucketName"],
deleteObjectsRequest=DeleteObjectsRequest(quiet=False, objects=objects, encoding_type=encoding_type)) deleteObjectsRequest=DeleteObjectsRequest(quiet=False, objects=objects, encoding_type=encoding_type))
if resp.status < 300: if resp.status < 300: