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

Django Rest Framework无法提供图片资源问题求助

解决Django媒体文件访问404问题

以下是针对你的情况的排查和修复步骤:

1. 确认DEBUG模式状态

Django的static()函数仅在DEBUG = True时生效,若当前为生产环境(DEBUG = False),开发服务器不会处理媒体文件请求:

  • 打开settings.py,检查DEBUG的值,开发阶段先设为True测试;
  • 生产环境需通过Nginx/Apache等Web服务器配置媒体文件路由,或使用WhiteNoise库处理。

2. 验证MEDIA_ROOT路径正确性

确保MEDIA_ROOT指向实际存放图片的目录:

  • 在Django shell中执行以下命令,输出实际路径:
    import os
    from django.conf import settings
    print(settings.MEDIA_ROOT)
    
  • 对比输出路径和你存放图片的assets目录是否一致,若不一致,调整MEDIA_ROOT:
    # 若settings.py在项目子目录下,BASE_DIR需调整为项目根目录
    MEDIA_ROOT = os.path.join(os.path.dirname(os.path.dirname(os.path.abspath(__file__))), 'assets')
    

3. 检查URL配置顺序与冲突

确保媒体文件的URL路由不会被其他路径拦截:

  • 将媒体文件的static配置移到urlpatterns的最后:
    urlpatterns = [
        path('', include(router.urls)),
    ]
    
    urlpatterns += staticfiles_urlpatterns()
    # 确保这一行在最后,避免被其他路由拦截
    urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
    
  • 检查DRF的router中是否存在与/pm/assets/匹配的路径,若有需修改避免冲突。

4. 修复文件权限问题

确保Django运行用户能读取媒体文件:

  • Linux/macOS系统执行:
    chmod -R 755 /path/to/your/project/assets/
    
  • Windows系统右键assets目录,在「属性-安全」中添加运行用户的读权限。

5. 优化Serializer返回完整图片URL

避免相对路径可能导致的问题,在Serializer中返回绝对URL:

class ProductsSerializer(serializers.ModelSerializer):
    image = serializers.SerializerMethodField()
    transactions_set = TransactionsSerializer(read_only=True, many=True)
    
    def get_image(self, obj):
        if obj.image:
            # 利用request对象生成完整URL
            return self.context['request'].build_absolute_uri(obj.image.url)
        return None
    
    class Meta:
        model = Product
        fields = ['pk','name','quantity','barcode','cost_price','image', 'selling_price', 'transactions_set']

注意:需在视图中传递request到Serializer的context:

class ProductViewSet(viewsets.ModelViewSet):
    def get_serializer_context(self):
        context = super().get_serializer_context()
        context['request'] = self.request
        return context

6. 其他检查

  • 重启Django开发服务器,确保配置修改生效;
  • 手动确认assets/images/下存在对应的图片文件,文件名与URL中的完全一致(注意大小写)。

内容的提问来源于stack exchange,提问作者Kyle Andrew

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 15:05:36