部署在railway.app的Django应用上传图片触发Server Error (500)
Django部署在Railway.app上传图片触发500错误排查
我已将Django应用部署在railway.app平台,开发环境中可正常上传图片,但在部署后的线上应用点击上传时触发Server Error (500)。以下是相关代码:
settings.py代码
STATIC_URL = 'static/' # STATIC_ROOT = BASE_DIR / 'staticfiles' STATICFILES_DIRS = [os.path.join(BASE_DIR, 'static')] STATIC_ROOT = os.path.join(BASE_DIR, 'staticfiles') if 'XXX' in os.environ: # Bucket config AWS_STORAGE_BUCKET_NAME = 'xxx' AWS_S3_REGION_NAME = 'xxx' AWS_ACCESS_KEY_ID = os.environ.get('AWS_ACCESS_KEY_ID') AWS_SECRET_ACCESS_KEY = os.environ.get('AWS_SECRET_ACCESS_KEY') AWS_S3_CUSTOM_DOMAIN = f'{AWS_STORAGE_BUCKET_NAME}.s3.amazonaws.com' # Static and media files STATICFILES_STORAGE = 'custom_storages.StaticStorage' STATICFILES_LOCATION = 'static' DEFAULT_FILE_STORAGE = 'custom_storages.MediaStorage' MEDIAFILES_LOCATION = 'media' # Override static and media URLs in production STATIC_URL = f'https://{AWS_S3_CUSTOM_DOMAIN}/{STATICFILES_LOCATION}/' MEDIA_URL = f'https://{AWS_S3_CUSTOM_DOMAIN}/{MEDIAFILES_LOCATION}/'
HTML代码
<div> <img src="{{user_profile.profile_img.url}}" alt="Profile Image"> </div> <a href="{% url 'profile-image' user_profile.user user_profile.profile_uuid %}"></a>
排查方向与解决办法
- 环境变量校验:
确认Railway后台已正确配置XXX、AWS_ACCESS_KEY_ID、AWS_SECRET_ACCESS_KEY环境变量,检查拼写是否正确、值是否为空;同时核对AWS_S3_REGION_NAME与S3桶实际区域是否一致。 - S3桶权限配置:
给对应的IAM用户配置s3:PutObject、s3:GetObject等必要权限;检查S3桶的CORS配置是否允许Railway应用域名访问。 - 自定义存储类检查:
确认custom_storages.py已部署到线上,其中的存储类需正确继承S3Boto3Storage并设置location属性,示例代码:
确保线上环境已安装from storages.backends.s3boto3 import S3Boto3Storage class StaticStorage(S3Boto3Storage): location = 'static' class MediaStorage(S3Boto3Storage): location = 'media'django-storages和boto3依赖,requirements.txt需包含这两个包。 - 查看错误日志:
在Railway应用控制台查看详细的500错误栈信息,直接定位具体错误原因(如权限不足、依赖缺失、存储类导入失败等)。 - 模板与路由检查:
确认上传表单的enctype属性设置为multipart/form-data;检查profile-image路由配置及对应视图函数的上传逻辑,避免依赖本地文件系统路径的代码。
内容的提问来源于stack exchange,提问作者Sohail Shams
相关产品推荐
相关产品推荐

