簡體   English   中英

為什么 S3(與 boto 和 django-storages 一起使用)甚至為公共文件提供簽名 url?

[英]Why does S3 (using with boto and django-storages) give signed url even for public files?

這很奇怪。 我混合了公共文件和私人文件。 我想要公共文件中的普通網址,以及私人文件中的簽名網址。

我試圖將AWS_QUERYSTRING_AUTH to False ,正如我默認看到的那樣,它在 django-storages 中是 True。

但是,當我更改它時,我的私人文件 url 未簽名(因此無法訪問)。

可能是我在這里遺漏了什么。 有什么辦法可以解決?

提前致謝。

AWS_QUERYSTRING_AUTH設置默認行為,但您可以在創建S3BotoStorage實例時通過將其他參數傳遞給初始化程序來覆蓋它:

S3BotoStorage(bucket="foo", querystring_auth=False)

因此,如果您有一個專用存儲桶和另一個存儲桶,則可以適當地設置querystring_auth參數並獲得所需的行為。

把它放在您的settings.py

AWS_QUERYSTRING_AUTH = False

解決此問題的另一種方法是在您的設置中設置AWS_S3_CUSTOM_DOMAIN。 @see: https//github.com/jschneier/django-storages/blob/master/storages/backends/s3boto.py#L478

(用boto == 2.38.0和django-storages-redux == 1.3測試)

您可以為單獨的文件夾、目錄創建單獨的存儲類型,並在那里管理訪問權限。

使用 Django - 創建一個可以調用“storage_aws.py”的文件並添加以下內容:

from storages.backends.s3boto3 import S3Boto3Storage

class PublicMediaStorage(S3Boto3Storage):
    location = 'media/location2/public'
    default_acl = 'public-read'
    file_overwrite = False
    querystring_auth=False

class PrivateMediaStorage(S3Boto3Storage):
    location = 'media/location1/private'
    default_acl = 'private'
    file_overwrite = False
    custom_domain = False
    querystring_auth=True

使用 default_acl 定義訪問權限(公共或私有) 使用位置定義位置 - (您可以指定路徑)像

location1 = 'media/location1/private'
location2 = 'media/location2/public'

*注意 querystring_auth=False 或 True

然后當你定義你的model時,你可以指定哪個位置使用哪個model

from django.db import models
from appname.storage_aws import PublicMediaStorage, PrivateMediaStorage


class Upload(models.Model):
    file = models.FileField(storage=PublicMediaStorage())


class UploadPrivate(models.Model):
    file = models.FileField(storage=PrivateMediaStorage())

私有文件將具有查詢字符串,而公共文件則不會,如“storage_aws.py”文件中所定義

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM