Azure部署的Django应用如何通过Cloudflare R2提供静态文件服务
Django 对接 Cloudflare R2 托管静态/媒体资源配置步骤
你已经完成Boto3和R2的连通验证,剩下的对接直接按下面的步骤配置就行:
- 安装依赖
先安装django-storages的S3适配包,已经装过boto3的话不用重复装:pip install django-storages[boto3] - 注册应用
打开Django项目的settings.py,把storages加到INSTALLED_APPS列表里:INSTALLED_APPS = [ # 保留你原有所有已注册的app 'storages', ] - 填写R2连接参数
还是在settings.py里添加R2的S3兼容配置,所有敏感参数建议从环境变量读取,不要硬编码到代码里:AWS_ACCESS_KEY_ID = "你的R2访问密钥ID" AWS_SECRET_ACCESS_KEY = "你的R2访问密钥值" AWS_STORAGE_BUCKET_NAME = "你的R2存储桶名称" AWS_S3_ENDPOINT_URL = "https://<你的R2账户ID>.r2.cloudflarestorage.com" # 填你给R2存储桶绑定的公开访问域名,不要带http/https前缀 AWS_S3_CUSTOM_DOMAIN = "R2公开访问域名,例:static.你的站点域名.com" AWS_S3_REGION_NAME = "auto" # R2固定填auto即可 AWS_DEFAULT_ACL = "public-read" # 给静态资源开公共读权限 AWS_S3_OBJECT_PARAMETERS = { "CacheControl": "max-age=86400", # 静态资源缓存时长,可按需求调整 } AWS_S3_FILE_OVERWRITE = False # 关闭同名文件自动覆盖,避免上传冲突 - 配置存储路由规则
根据你自己的需求选对应配置就行:- 仅把图片等用户上传的媒体资源放到R2,保留原有WhiteNoise托管应用自带静态文件的方案(推荐,改动最小)
# 媒体文件存储走R2 DEFAULT_FILE_STORAGE = "storages.backends.s3boto3.S3Boto3Storage" MEDIA_URL = f"https://{AWS_S3_CUSTOM_DOMAIN}/media/" # 原有的STATIC_URL、WhiteNoise相关配置全部保留不动- 把所有静态资源全量切到R2,替换WhiteNoise
先把settings.py里WhiteNoise相关的中间件、静态文件存储配置注释掉,再添加下面的配置:
STATICFILES_STORAGE = "storages.backends.s3boto3.S3StaticStorage" STATIC_URL = f"https://{AWS_S3_CUSTOM_DOMAIN}/static/" DEFAULT_FILE_STORAGE = "storages.backends.s3boto3.S3Boto3Storage" MEDIA_URL = f"https://{AWS_S3_CUSTOM_DOMAIN}/media/" - Cloudflare侧配套配置
- 打开R2存储桶的公开访问权限,绑定你准备好的自定义域名,开启Cloudflare代理即可享受零出口带宽费
- 给存储桶配置CORS规则,允许你自己的站点域名访问资源,避免前端加载时出现跨域报错,规则参考:
[ { "AllowedOrigins": ["https://你的站点域名"], "AllowedMethods": ["GET"], "AllowedHeaders": ["*"], "MaxAgeSeconds": 3000 } ] - 验证生效
配置完成后,如果是全量托管静态文件,执行python manage.py collectstatic,命令会自动把所有项目静态文件上传到R2桶的static路径下;如果仅托管媒体资源,后续所有通过Django文件字段上传的资源都会自动同步到R2,模板里调用{{ 文件字段.url }}会自动生成R2的公开访问地址,不需要修改原有业务代码。
注意:如果之前一直用WhiteNoise托管静态资源,建议先切媒体资源到R2跑1-2天确认无异常,再全量切换静态资源,避免出现站点样式、脚本加载失败的问题。
内容的提问来源于stack exchange,提问作者Jose Vega
相关产品推荐
相关产品推荐

