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

Django与React结合项目中如何服务图片等静态及媒体文件

问题根源

路由匹配顺序错误导致媒体/静态资源请求被React万能路由拦截,同时settings.py存在重复的MEDIA_URL配置项冲突。

开发环境修复方案

1. 调整urls.py路由顺序

Django路由按照从上到下的优先级匹配,需将React万能匹配路由放在所有路由的最后,开发环境的静态/媒体路由要放在万能路由之前:

urls.py
from django.conf import settings
from django.conf.urls.static import static
from django.urls import path, re_path
from django.views.generic import TemplateView

urlpatterns = [
    # 优先放Django原生路由:后台、API接口、认证相关路由等
    path('admin/', admin.site.urls),
    path('api/', include('你的api应用.urls')),
]

# 开发环境的静态、媒体资源路由放在中间位置
if settings.DEBUG:
    urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT) \
        + static(settings.STATIC_URL, document_root=settings.STATIC_ROOT)

# React万能匹配路由放在最后,仅当前面所有路由都匹配失败时才触发
urlpatterns += [
    re_path(r'^.*', TemplateView.as_view(template_name='index.html'))
]

2. 修正settings.py重复配置

删除重复定义的MEDIA_URL,保留一个即可:

settings.py
STATICFILES_DIRS = [os.path.join(BASE_DIR, 'build/static')]
STATIC_URL = '/static/'
STATIC_ROOT = os.path.join(BASE_DIR, 'staticfiles')
# 保留你需要的MEDIA_URL即可,二选一删除
MEDIA_URL =  '/media/images/'
MEDIA_ROOT = os.path.join(BASE_DIR, 'media/')

TEMPLATES = [
    {
        # 其他原有配置
        'DIRS': [os.path.join(BASE_DIR, 'build')],
    }
]

生产环境AWS S3配置指导

1. 安装依赖

pip install django-storages boto3

2. 新增settings.py配置

# 加入storages应用
INSTALLED_APPS = [
    # 其他原有应用
    'storages',
]

# AWS S3基础配置
AWS_ACCESS_KEY_ID = '你的AWS访问密钥ID'
AWS_SECRET_ACCESS_KEY = '你的AWS访问密钥'
AWS_STORAGE_BUCKET_NAME = '你的S3桶名称'
AWS_S3_REGION_NAME = '桶所属区域,例如ap-northeast-1'
AWS_S3_CUSTOM_DOMAIN = f'{AWS_STORAGE_BUCKET_NAME}.s3.{AWS_S3_REGION_NAME}.amazonaws.com'
AWS_S3_FILE_OVERWRITE = False
AWS_DEFAULT_ACL = None

# 静态文件S3配置
STATIC_URL = f'https://{AWS_S3_CUSTOM_DOMAIN}/static/'
STATICFILES_STORAGE = 'storages.backends.s3boto3.S3Boto3Storage'

# 媒体文件S3配置
MEDIA_URL = f'https://{AWS_S3_CUSTOM_DOMAIN}/media/'
DEFAULT_FILE_STORAGE = 'storages.backends.s3boto3.S3Boto3Storage'

生产环境无需保留DEBUG模式下的静态/媒体路由配置,所有静态、媒体资源会直接从S3加载,Django仅负责处理API、后台路由,剩余未匹配请求返回React的index.html即可。

内容的提问来源于stack exchange,提问作者C-Bizz

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 22:27:03