Django部署Railway后媒体文件404错误求助
解决Railway部署Django后媒体图片404问题
一、问题根源
urls.py中仅在DEBUG=True时添加媒体文件路由,但Railway运行环境即使开启DEBUG,也并非Django开发服务器(runserver),无法自动处理媒体文件的静态服务。- Railway采用临时文件系统,上传的媒体文件会在应用重启后丢失,这是长期运行的隐患。
二、临时测试修复
若仅需临时让媒体文件可访问,修改urls.py,移除if settings.DEBUG判断,确保媒体路由始终生效:
from django.contrib import admin from django.urls import path,include from django.conf import settings from django.conf.urls.static import static admin.site.site_header = 'Admin Panel' urlpatterns = [ path('admin/', admin.site.urls), path('cart/',include('cart.urls',namespace="cart")), path('orders/',include('orders.urls',namespace='orders')), path('payment/',include('payment.urls',namespace='payment')), path('',include('shop.urls',namespace="shop")), ] # 移除DEBUG判断,始终添加媒体文件路由 urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
⚠️ 注意:此方法仅适用于测试,临时文件系统会导致重启后文件丢失,正式环境必须使用云存储。
三、正式解决方案(云存储示例:Cloudinary)
步骤1:安装依赖
pip install cloudinary django-cloudinary-storage
步骤2:修改settings.py
- 将Cloudinary相关应用加入
INSTALLED_APPS:
INSTALLED_APPS = [ 'shop', 'cart', 'orders', 'payment', 'phone_field', 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'whitenoise.runserver_nostatic', 'django.contrib.staticfiles', # 添加以下两项 'cloudinary', 'cloudinary_storage', ]
- 配置Cloudinary存储后端,替换默认媒体存储:
import os CLOUDINARY_STORAGE = { 'CLOUD_NAME': os.environ.get('CLOUDINARY_CLOUD_NAME'), 'API_KEY': os.environ.get('CLOUDINARY_API_KEY'), 'API_SECRET': os.environ.get('CLOUDINARY_API_SECRET'), } # 设置媒体文件存储为Cloudinary DEFAULT_FILE_STORAGE = 'cloudinary_storage.storage.MediaCloudinaryStorage'
- 保留
MEDIA_URL,注释掉本地MEDIA_ROOT配置:
MEDIA_URL = '/media/' # MEDIA_ROOT = BASE_DIR / 'media' # 注释此行
步骤3:在Railway配置环境变量
进入Railway项目的「Variables」页面,添加以下三个环境变量:
CLOUDINARY_CLOUD_NAME:你的Cloudinary账号云名称CLOUDINARY_API_KEY:你的Cloudinary API密钥CLOUDINARY_API_SECRET:你的Cloudinary API密钥密码
步骤4:更新部署
修改配置后,重新部署Railway应用,确保依赖和配置生效。
四、额外注意事项
- 正式部署时关闭DEBUG模式,并将Railway域名加入
ALLOWED_HOSTS:
DEBUG = False ALLOWED_HOSTS = ['web-production-08528.up.railway.app', '127.0.0.1']
内容的提问来源于stack exchange,提问作者shafquet
相关产品推荐
相关产品推荐

