在Wagtail中使用AWS S3进行私有文档。
项目描述
wagtail-storages
此软件包填补了在Wagtail中使用AWS S3时缺失的功能。如果您想
使用AWS S3存储桶托管Wagtail文档。
将存储桶放在CDN后面,以便每次都不直接调用存储桶。
允许编辑在文档上使用隐私控制,同时使用CDN。
避免由于通过Wagtail视图代理下载而导致的超时。
注意:如果您想确保文档真正私密,则不能使用 重定向视图 。
它做什么?
该软件包是信号处理程序和Wagtail钩子的集合。
当Wagtail文档的隐私设置更改时,在S3上设置每个对象的ACL。
用重定向替换当前文档视图。可以是私有文档的签名S3存储桶URL,或公共文档的公共自定义域名URL。
清除已更改的文档的CDN。
要求
django-storages 与配置在Wagtail项目中的 S3Boto3Storage 存储后端。
由Wagtail前端缓存无效化器支持的CDN。
管理命令
django-admin fix_document_acls
该软件包提供了一种管理命令,根据文档的集合权限设置所有文档的ACL。如果在使用软件包之前存储桶中已有文档,则必须调用此命令以确保存储桶中的ACL是正确的。
设置
WAGTAIL_STORAGES_DOCUMENTS_FRONTENDCACHE
使用与Wagtail的 WAGTAILFRONTENDCACHE 设置相同的格式,但仅供wagtail-storages用于清除文档。如果未设置,则不会执行清除。有关如何格式化的更多信息,请参阅Wagtail文档,例如。
WAGTAIL_STORAGES_DOCUMENTS_FRONTENDCACHE = {
'cloudfront': {
'BACKEND': 'wagtail.contrib.frontend_cache.backends.CloudfrontBackend',
'DISTRIBUTION_ID': 'your-distribution-id',
},
}
WAGTAIL_STORAGES_DOCUMENT_HOOK_ORDER
设置文档钩子顺序的自定义顺序。默认设置为100。由于它返回响应,因此它必须在任何钩子之后运行,例如。
WAGTAIL_STORAGES_DOCUMENT_HOOK_ORDER = 900
与Wagtail推荐的S3设置
以下指南解释了使用S3与Wagtail推荐的设置。本指南假设
您在 llamasavers.com 上提供主要网站(将 llamasavers.com 替换为您实际的域名)。
您的S3存储桶名称为 media.llamasavers.com,并从该域名托管。
您在该域名上使用CDN,本指南将假设Cloudflare。
设置S3存储桶
首先,设置您的S3存储桶。它必须配置为
具有与域名匹配的名称,例如 media.llamasavers.com。
- 允许用户执行以下操作
s3:ListBucket
s3:GetBucketLocation
s3:ListBucketMultipartUploads
s3:ListBucketVersions
允许用户对存储桶中的对象执行所有操作 (s3:*)。
允许互联网流量访问Wagtail图像渲染 (images/*)。
- 允许使用公共ACL,通过禁用
“阻止通过新访问控制列表(ACL)授予对存储桶和对象的公共访问”
“阻止通过任何访问控制列表(ACL)授予对存储桶和对象的公共访问”
用户权限可以在IAM或通过存储桶策略中设置。请参阅以下存储桶策略中实现所有这些点的示例。
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "PublicGetObject",
"Effect": "Allow",
"Principal": "*",
"Action": "s3:GetObject",
"Resource": "arn:aws:s3:::[BUCKET NAME]/images/*"
},
{
"Sid": "AllowUserManageBucket",
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::[USER ARN]"
},
"Action": [
"s3:ListBucket",
"s3:GetBucketLocation",
"s3:ListBucketMultipartUploads",
"s3:ListBucketVersions"
],
"Resource": "arn:aws:s3:::[BUCKET NAME]"
},
{
"Sid": "AllowUserManageBucketObjects",
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::[USER ARN]"
},
"Action": "s3:*",
"Resource": "arn:aws:s3:::[BUCKET NAME]/*"
}
]
}
在AWS上设置S3存储桶后,您可以配置Wagtail项目以使用它。
设置django-storages
安装 django-storages 和 boto3。
pip install django-storages[boto3]
使用 django-storages 设置您的S3存储桶。以下代码允许通过环境变量进行配置。
# settings.py
import os
if "AWS_STORAGE_BUCKET_NAME" in os.environ:
# Add django-storages to the installed apps
INSTALLED_APPS = INSTALLED_APPS + ["storages"]
# https://docs.django.ac.cn/en/stable/ref/settings/#default-file-storage
DEFAULT_FILE_STORAGE = "storages.backends.s3boto3.S3Boto3Storage"
AWS_STORAGE_BUCKET_NAME = os.environ["AWS_STORAGE_BUCKET_NAME"]
# Disables signing of the S3 objects' URLs. When set to True it
# will append authorization querystring to each URL.
AWS_QUERYSTRING_AUTH = False
# Do not allow overriding files on S3 as per Wagtail docs recommendation:
# https://docs.wagtail.io/en/stable/advanced_topics/deploying.html#cloud-storage
# Not having this setting may have consequences such as losing files.
AWS_S3_FILE_OVERWRITE = False
# Default ACL for new files should be "private" - not accessible to the
# public. Images should be made available to public via the bucket policy,
# where the documents should use wagtail-storages.
AWS_DEFAULT_ACL = "private"
# We generally use this setting in production to put the S3 bucket
# behind a CDN using a custom domain, e.g. media.llamasavers.com.
# https://django-storages.readthedocs.io/en/latest/backends/amazon-S3.html#cloudfront
if "AWS_S3_CUSTOM_DOMAIN" in os.environ:
AWS_S3_CUSTOM_DOMAIN = os.environ["AWS_S3_CUSTOM_DOMAIN"]
# When signing URLs is enabled, the region must be set.
# The global S3 endpoint does not seem to support signed URLS.
# Set this only if you will be using signed URLs.
if "AWS_S3_REGION_NAME" in os.environ:
AWS_S3_REGION_NAME = os.environ["AWS_S3_REGION_NAME"]
# This settings lets you force using http or https protocol when generating
# the URLs to the files. Set https as default.
# https://github.com/jschneier/django-storages/blob/10d1929de5e0318dbd63d715db4bebc9a42257b5/storages/backends/s3boto3.py#L217
AWS_S3_URL_PROTOCOL = os.environ.get("AWS_S3_URL_PROTOCOL", "https:")
如果您使用上述片段,则可以设置以下环境变量
AWS_STORAGE_BUCKET_NAME - 设置为 media.llamasavers.com。
AWS_S3_CUSTOM_DOMAIN - 设置为 media.llamasavers.com。
AWS_S3_REGION_NAME - 设置为您的 AWS 区域名称,例如 eu-west-2。
您可以使用以下方法之一为 boto3 提供凭证。我们建议您使用环境变量。为此,您需要设置以下变量
AWS_ACCESS_KEY_ID
AWS_SECRET_ACCESS_KEY
现在存储应该已经配置并正在运行。编辑器应该能够在 Wagtail 管理中上传图片和文档。
设置 wagtail-storages
安装 wagtail-storages 本身。
pip install wagtail-storages
将 wagtail_storages 添加到您的设置文件中的 INSTALLED_APPS。
# settings.py
INSTALLED_APPS = [
# ... Other apps
"wagtail_storages.apps.WagtailStoragesConfig",
# ... Other apps
]
这样,如果文档被移动到私有收藏夹,ACLs 应该会更新。
如果您已经在您的 S3 桶中有了文件,请运行 django-admin fix_document_acls 以确保所有文档都已正确设置了 ACLs。
设置前端缓存失效
如果自定义域名(media.llamasavers.com)上设置了边缘缓存,您应该设置 CDN 清理以避免通过 CDN 端点向用户提供过时或私有文档。例如,对于 Cloudflare,您希望使用以下类似的配置
# settings.py
import os
if "S3_CACHE_CLOUDFLARE_TOKEN" in os.environ:
WAGTAIL_STORAGES_DOCUMENTS_FRONTENDCACHE = {
"default": {
"BACKEND": "wagtail.contrib.frontend_cache.backends.CloudflareBackend",
"EMAIL": os.environ["S3_CACHE_CLOUDFLARE_EMAIL"],
"TOKEN": os.environ["S3_CACHE_CLOUDFLARE_TOKEN"],
"ZONEID": os.environ["S3_CACHE_CLOUDFLARE_ZONEID"],
},
}
然后设置以下环境变量
S3_CACHE_CLOUDFLARE_EMAIL
S3_CACHE_CLOUDFLARE_TOKEN
S3_CACHE_CLOUDFLARE_ZONEID
一旦设置,当文档被修改或隐私设置发生变化时,将从缓存中清除文档。
此设置遵循 Wagtail 前端缓存失效配置的配置格式。请参阅详细信息 此处。唯一的区别是设置名称,对于 wagtail-storages 来说是 WAGTAIL_STORAGES_DOCUMENTS_FRONTENDCACHE。
完成所有操作!
项目详情
下载文件
下载适合您平台的自定义文件。如果您不确定要选择哪个,请了解有关 安装包 的更多信息。