Django ckeditor上载图像链接在几个小时后过期

Django ckeditor上载图像链接在几个小时后过期,django,ckeditor,django-ckeditor,Django,Ckeditor,Django Ckeditor,我使用Django storages在云中存储静态内容,使用CKEditor作为文本编辑器,并使用RichTextUploadingField字段。 问题是当我通过CKEditor上传图像时,图像链接在几个小时后过期。 下图供参考 以及应用程序中的字段 bio=RichTextUploadingField(blank=True,null=True) 如果我通过ImageField上传图像,链接将永远不会过期。该问题仅出现在CKEditor图像上载程序中 知道链接过期的原因吗?问题是带有授权的链

我使用Django storages在云中存储静态内容,使用CKEditor作为文本编辑器,并使用
RichTextUploadingField
字段。 问题是当我通过CKEditor上传图像时,图像链接在几个小时后过期。 下图供参考

以及应用程序中的字段

bio=RichTextUploadingField(blank=True,null=True)

如果我通过
ImageField
上传图像,链接将永远不会过期。该问题仅出现在CKEditor图像上载程序中


知道链接过期的原因吗?

问题是带有授权的链接是用html字符串硬编码的。默认设置过期时间为1小时。所以在编辑器中编辑html一小时后,它们就过期了

我在论坛和GitHub问题上发现了许多建议,建议打开s3链接查询授权并公开存储。聪明的建议。。。。顾客会很高兴的

我的走来走去:

  • 代理视图,它获取图像路径(AmazonS3对象键)并生成预签名url
  • 在模型保存时,我获取html值并使用regex替换代理路径上s3的img路径
  • 创建路径:

    #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或其他东西中,但现在我的情况不是这样

    这并不完美,但肯定比公开存储要好