Vercel免费部署Django站点:上传文件/图片遇只读文件系统错误
解决Vercel部署Django后媒体文件上传只读文件系统错误
Vercel的服务器文件系统是只读的,无法直接写入/var/task/media这类本地目录,必须使用外部云存储服务来托管媒体文件。以下是具体解决步骤:
1. 安装必要依赖
安装Django存储后端工具和云存储SDK(以AWS S3为例,Cloudflare R2、DigitalOcean Spaces等S3兼容存储服务也适用):
pip install django-storages boto3 pillow
django-storages:提供第三方存储后端的集成能力boto3:对接S3兼容存储服务的SDKpillow:Django处理ImageField所需的图片处理库
2. 配置Django存储后端
在settings.py中添加以下配置:
# 将storages加入已安装应用列表 INSTALLED_APPS = [ # 原有应用... 'storages', ] # 存储服务核心配置 import os DEFAULT_FILE_STORAGE = 'storages.backends.s3boto3.S3Boto3Storage' AWS_ACCESS_KEY_ID = os.environ.get('AWS_ACCESS_KEY_ID') AWS_SECRET_ACCESS_KEY = os.environ.get('AWS_SECRET_ACCESS_KEY') AWS_STORAGE_BUCKET_NAME = os.environ.get('AWS_STORAGE_BUCKET_NAME') AWS_S3_REGION_NAME = os.environ.get('AWS_S3_REGION_NAME') # 示例:'us-east-1' AWS_S3_CUSTOM_DOMAIN = f"{AWS_STORAGE_BUCKET_NAME}.s3.amazonaws.com" MEDIA_URL = f"https://{AWS_S3_CUSTOM_DOMAIN}/" # 可选配置(公开可读存储桶适用) AWS_S3_FILE_OVERWRITE = False AWS_DEFAULT_ACL = 'public-read'
3. 在Vercel中设置环境变量
避免硬编码敏感信息,进入Vercel项目的Settings > Environment Variables,添加以下变量:
AWS_ACCESS_KEY_ID:存储服务的访问密钥IDAWS_SECRET_ACCESS_KEY:存储服务的秘密访问密钥AWS_STORAGE_BUCKET_NAME:存储桶名称AWS_S3_REGION_NAME:存储桶所在区域
4. 配置存储桶权限
确保存储桶的权限支持上传和访问:
- 设置CORS规则,允许你的Django站点域名发起上传请求
- 配置存储桶策略,授予文件的读写权限(公开桶可设置
public-read权限)
5. 验证配置
重新部署Django项目到Vercel,尝试从管理面板上传图片/文件,此时文件会直接存储到云存储服务,绕过Vercel的只读文件系统限制,即可解决权限错误。
内容的提问来源于stack exchange,提问作者Sudipto Sarker
相关产品推荐
相关产品推荐

