Django ckeditor上载图像链接在几个小时后过期
我使用Django storages在云中存储静态内容,使用CKEditor作为文本编辑器,并使用Django ckeditor上载图像链接在几个小时后过期,django,ckeditor,django-ckeditor,Django,Ckeditor,Django Ckeditor,我使用Django storages在云中存储静态内容,使用CKEditor作为文本编辑器,并使用RichTextUploadingField字段。 问题是当我通过CKEditor上传图像时,图像链接在几个小时后过期。 下图供参考 以及应用程序中的字段 bio=RichTextUploadingField(blank=True,null=True) 如果我通过ImageField上传图像,链接将永远不会过期。该问题仅出现在CKEditor图像上载程序中 知道链接过期的原因吗?问题是带有授权的链
RichTextUploadingField
字段。
问题是当我通过CKEditor上传图像时,图像链接在几个小时后过期。
下图供参考
以及应用程序中的字段
bio=RichTextUploadingField(blank=True,null=True)
如果我通过ImageField
上传图像,链接将永远不会过期。该问题仅出现在CKEditor图像上载程序中
知道链接过期的原因吗?问题是带有授权的链接是用html字符串硬编码的。默认设置过期时间为1小时。所以在编辑器中编辑html一小时后,它们就过期了 我在论坛和GitHub问题上发现了许多建议,建议打开s3链接查询授权并公开存储。聪明的建议。。。。顾客会很高兴的 我的走来走去:
#url.py
从.s3proxy导入s3proxy
网址+=[
...
路径('s3image',s3proxy),
...
]
构建代理视图,为此,我将转换url函数放在同一个文件中
#s3proxy.py
从django.http导入HttpResponseRedirect
进口boto3
导入操作系统
进口稀土
AWS\u ACCESS\u KEY\u ID=os.getenv('AWS\u ACCESS\u KEY\u ID'))
AWS\u SECRET\u ACCESS\u KEY=os.getenv('AWS\u SECRET\u ACCESS\u KEY'))
AWS\u STORAGE\u BUCKET\u NAME=os.getenv('AWS\u STORAGE\u BUCKET\u NAME'))
AWS\u URL=os.getenv('AWS\u URL')
AWS_S3_地区_名称='eu-central-1'
def S3代理(请求):
path=req.GET.GET('p',无)
如果不是路径:
返回HttpResponse(状态=404)
s3_client=boto3.client('s3',
aws\u访问\u密钥\u id=aws\u访问\u密钥\u id,
aws_secret_access_key=aws_secret_access_key,
地区名称=AWS地区名称
)
response=s3\u client.generate\u presigned\u url(
ClientMethod='get_object',
Params={
“Bucket”:AWS\u存储\u Bucket\u名称,
“键”:路径
},ExpiresIn=172800
)
返回HttpResponseRedirect(响应)
def transformImgUrl(html):
img|u path=“(?:“+AWS_URL+”)(.\.(?:png|jpg|jpeg|gif))”
图案=”(
关于模型中的保存方法:
#模型文件
类MyModel(models.Model):
html=models.TextField(
详细名称='Html值',
默认值=“”
)
def保存(自我):
self.html=transformImgUrl(self.html)
super(MyModel,self).save()
现在所有图像保存后的路径指向我的代理路径,该路径生成重定向到AmazonS3
因此,它来自ckeditor html内容:
“”“
https://fasdfasdf.s3.amazonaws.com/media/upload/fake-img.png?X-Amz算法=AWS4-HMAC-SHA256&X-Amz-Credential=AKIA4L6S3asdfasdf210316%2Feu-central-1%2Fs3%2Faws4_请求&X-Amz-Date=202103145654094143Z&X-Amz-Expires=172800&X-Amz-SignedHeaders=host&X-Amz-Signature=2494010AD11ASDFASDFASFA36A70AB3DAB4506B70EDA366FCD9B3D72AC
"""
并在img src中创建此url:
"/s3image?p=media/upload/fake-img.png"
现在,当brosswer调用此url时,它将使用auth查询生成新的AmazonS3资源url,并将调用重定向到该url
在我的版本中,我将过期时间设置为2天(172800秒),因为我在计划中设置了一天缓存。但请注意,过期时间过长是无效的。我没有进行精确检查,但您无法设置过期时间。事件月限约为10天,可能是14天左右
唯一的缺点是由于代理路由和额外的创建预签名url的调用而导致的访问时间过长。这可以缓存在redis或其他东西中,但现在我的情况不是这样
这并不完美,但肯定比公开存储要好