Django中Uppy对接DigitalOcean Spaces时出现AttributeError问题求助
Django中Uppy对接DigitalOcean Spaces时出现AttributeError问题求助
嘿,我碰到过类似的问题,来帮你排查下!你现在遇到的AttributeError: 'dict' object has no attribute 'status_code',主要是两个地方出了问题,咱们一步步来解决:
1. Django视图返回格式不对
你的后端视图直接return了一个字典,但Django视图要求返回合法的HTTP响应对象。要是直接return字典,Django会把它当成模板渲染的上下文,而不是JSON响应,这会导致前端fetch请求解析失败,Uppy拿到的不是预期的参数结构,从而触发这个错误。
修正方法:用Django的JsonResponse来返回参数,代码改成这样:
from django.http import JsonResponse import boto3 from botocore.config import Config def uppy_s3_view(request): # 初始化DigitalOcean Spaces客户端 client = boto3.client( 's3', region_name='sgp1', endpoint_url='https://sgp1.digitaloceanspaces.com', aws_access_key_id=SPACES_KEY, aws_secret_access_key=SPACES_SECRET, config=Config(s3={'addressing_style': 'virtual'}) ) # 生成PUT方法的预签名URL(之前用get_object是错的,那是下载用的) url = client.generate_presigned_url( ClientMethod='put_object', Params={ "Bucket": "mysite-bucket", "Key": "uppyfile.pdf" # 建议改成动态获取前端传的文件名,比如request.GET.get('filename') }, ExpiresIn=3600 ) # 用JsonResponse返回参数 return JsonResponse({ "method": "PUT", "url": url, "headers": { "content-type": "application/pdf" # 同样建议动态获取前端的file.type } })
2. 预签名URL的生成方法用错了
你之前用get_object生成的是用于下载文件的GET预签名URL,但Uppy上传需要的是PUT方法的预签名URL,所以必须改成put_object,不然上传时会因为请求方法不匹配或者权限问题失败。
另外还有两个小提醒:
- 别硬编码文件名和content-type,最好从前端Uppy的
file对象里获取相关信息,比如前端可以把file.name和file.type通过fetch传给后端,后端动态生成对应的Key和content-type,这样能支持多种文件类型。 - 确保你的DigitalOcean Spaces Bucket的CORS配置允许PUT请求,并且放行你的前端域名,不然会出现跨域错误。CORS配置大概是这样的:
<CORSConfiguration> <CORSRule> <AllowedOrigin>你的前端域名,比如https://your-site.com</AllowedOrigin> <AllowedMethod>PUT</AllowedMethod> <AllowedHeader>*</AllowedHeader> <MaxAgeSeconds>3000</MaxAgeSeconds> </CORSRule> </CORSConfiguration>
内容来源于stack exchange
相关产品推荐
相关产品推荐

