You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Django部署Railway生产环境,用户上传媒体文件无法加载

Django部署Railway后上传图片无法加载的问题解决

问题描述

站点部署在Railway平台,其余功能运行正常,但用户上传的图片无法加载,服务器返回404错误,提示找不到/media路径下的图片文件。

相关配置

settings.py

STATIC_URL = '/static/'

STATICFILES_DIRS = [
    os.path.join(BASE_DIR,'static')
]

MEDIA_URL ='/media/'
MEDIA_ROOT = os.path.join(BASE_DIR,'media')

models.py

class Post(models.Model):
    img = models.ImageField(upload_to="pics")

blog.html

{% extends 'base.html' %}
{% load static %}

{% static "images/projects" as baseUrl %}

{% for post in post_list %}
 <div class="image_wrapper"><a href="{% url 'post_detail' post.slug %}" target="_parent"><img
                    src="{{ post.img.url }}" alt="image 1"/></a></div>

 {% endfor %}

urls.py

urlpatterns = urlpatterns + static(settings.MEDIA_URL,document_root= settings.MEDIA_ROOT)

if settings.DEBUG:
    urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)

报错信息

Not Found: /media/pics/CC_Tech_Computers_1_6rgae2m.jpg
Not Found: /media/pics/CC_Tech_Computers_1_6rgae2m.jpg
Not Found: /media/pics/CC_Tech_Computers_1_6rgae2m.jpg
Not Found: /media/pics/CC_Tech_Computers_1_6rgae2m.jpg

问题分析

  1. 生产环境媒体路由失效:Django的static()函数仅在DEBUG模式下生效,Railway默认运行在生产环境(DEBUG=False),此时urls.py中的媒体路由不会被加载,导致无法访问/media路径下的文件。同时你当前的urls.py还重复添加了媒体路由,属于冗余配置。
  2. Railway文件系统特性:Railway的容器文件系统是临时的,重启容器后上传的媒体文件会被清除,即使配置了本地媒体路径,也无法持久化存储文件。

解决步骤

1. 清理冗余的urls.py配置

保留仅DEBUG模式下的媒体路由即可,生产环境无需通过Django提供媒体文件:

if settings.DEBUG:
    urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)

2. 使用第三方存储服务(推荐方案)

由于Railway的临时文件系统限制,必须使用外部存储服务来持久化媒体文件,以Cloudinary为例:

  • 安装依赖:
pip install cloudinary django-cloudinary-storage
  • 在settings.py中添加配置:
INSTALLED_APPS += [
    'cloudinary',
    'cloudinary_storage',
]

CLOUDINARY_STORAGE = {
    'CLOUD_NAME': '你的Cloudinary云名称',
    'API_KEY': '你的API密钥',
    'API_SECRET': '你的API密钥密码'
}

DEFAULT_FILE_STORAGE = 'cloudinary_storage.storage.MediaCloudinaryStorage'

配置完成后,用户上传的图片会直接存储到Cloudinary的CDN中,post.img.url会返回CDN链接,无需额外配置媒体路由。

3. 临时测试用的本地媒体服务配置(不推荐生产使用)

如果仅用于临时测试,可通过Whitenoise处理媒体文件访问:

  • 安装Whitenoise:
pip install whitenoise
  • 修改settings.py配置:
# 在INSTALLED_APPS最前面添加
INSTALLED_APPS = [
    'whitenoise.runserver_nostatic',
    'django.contrib.staticfiles',
    # 其他已有的APP...
]

# 在MIDDLEWARE中添加WhiteNoise中间件
MIDDLEWARE = [
    'django.middleware.security.SecurityMiddleware',
    'whitenoise.middleware.WhiteNoiseMiddleware',
    # 其他已有的中间件...
]

WHITENOISE_MEDIA_PREFIX = '/media/'
STATIC_ROOT = os.path.join(BASE_DIR, 'staticfiles')
MEDIA_ROOT = os.path.join(BASE_DIR, 'media')
  • 收集静态文件:
python manage.py collectstatic

注意:此方案下,Railway容器重启后上传的媒体文件会丢失,仅适合临时测试。

内容的提问来源于stack exchange,提问作者santosh acharya

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 05:05:14