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

Django无模型场景下,如何用GET查看POST提交的图片名API数据

解决方案:无模型实现DRF上传后GET返回图片名称

首先,你的核心需求是在不使用数据库模型的情况下,上传图片后通过GET请求返回该图片的名称。因为HTTP请求是无状态的,我们需要一个临时存储来保存最近上传的文件名,下面提供几种不同场景的实现方案:

1. 简单测试方案:全局变量存储(仅适合本地测试)

如果只是本地开发测试,用全局变量最直接,修改你的views.py如下:

from rest_framework.views import APIView
from rest_framework.response import Response
from .serializers import ImgSerializer
from rest_framework import status
from rest_framework.parsers import FileUploadParser
from django.core.files.storage import FileSystemStorage
from django.conf import settings

# 全局变量存储最近一次上传的文件名(注意:生产多进程环境会失效)
latest_image_name = None

class ImageAPI(APIView):
    parser_classes = (FileUploadParser,)
    
    def post(self, request):
        global latest_image_name
        # 获取上传的图片(key对应POSTMAN里的参数名'image')
        uploaded_file = request.data.get('image')
        
        if not uploaded_file:
            return Response({"error": "Please upload an image"}, status=status.HTTP_400_BAD_REQUEST)
        
        # 保存文件到指定目录
        fs = FileSystemStorage(location=settings.PRIVATE_STORAGE_ROOT)
        filename = fs.save(uploaded_file.name, uploaded_file)
        
        # 更新全局变量为当前文件名
        latest_image_name = filename
        
        # 用序列化器返回单个对象(符合你预期的格式)
        serializer = ImgSerializer({"image_name": filename})
        return Response(serializer.data, status=status.HTTP_201_CREATED)
    
    def get(self, request):
        global latest_image_name
        if not latest_image_name:
            return Response({"error": "No image uploaded yet"}, status=status.HTTP_404_NOT_FOUND)
        
        # 返回最近上传的文件名
        serializer = ImgSerializer({"image_name": latest_image_name})
        return Response(serializer.data, status=status.HTTP_200_OK)

注意点:

  • 全局变量在生产环境(比如Gunicorn多进程部署)会失效,因为每个进程有独立的内存空间,所以这个方案只适合本地测试。
  • 我调整了POST方法的返回格式:去掉了many=True,直接序列化单个字典,这样返回结果就是你要的{"image_name": "xxx"},而不是数组格式。

2. 生产环境方案:缓存存储

如果要部署到生产环境,推荐用Django的缓存系统(比如Redis)来存储最近的文件名,这样所有进程都能共享这个值。

首先在settings.py配置缓存(以Redis为例):

CACHES = {
    'default': {
        'BACKEND': 'django.core.cache.backends.redis.RedisCache',
        'LOCATION': 'redis://127.0.0.1:6379/1',
    }
}

然后修改views.py:

from rest_framework.views import APIView
from rest_framework.response import Response
from .serializers import ImgSerializer
from rest_framework import status
from rest_framework.parsers import FileUploadParser
from django.core.files.storage import FileSystemStorage
from django.conf import settings
from django.core.cache import cache

class ImageAPI(APIView):
    parser_classes = (FileUploadParser,)
    # 缓存键名,用于标识存储的文件名
    CACHE_KEY = "latest_uploaded_image"
    
    def post(self, request):
        uploaded_file = request.data.get('image')
        if not uploaded_file:
            return Response({"error": "Please upload an image"}, status=status.HTTP_400_BAD_REQUEST)
        
        fs = FileSystemStorage(location=settings.PRIVATE_STORAGE_ROOT)
        filename = fs.save(uploaded_file.name, uploaded_file)
        
        # 将文件名存入缓存,永久有效直到被新的上传覆盖
        cache.set(self.CACHE_KEY, filename, timeout=None)
        
        serializer = ImgSerializer({"image_name": filename})
        return Response(serializer.data, status=status.HTTP_201_CREATED)
    
    def get(self, request):
        # 从缓存中获取最近的文件名
        latest_image_name = cache.get(self.CACHE_KEY)
        if not latest_image_name:
            return Response({"error": "No image uploaded yet"}, status=status.HTTP_404_NOT_FOUND)
        
        serializer = ImgSerializer({"image_name": latest_image_name})
        return Response(serializer.data, status=status.HTTP_200_OK)

3. 按客户端区分:会话存储

如果需要每个客户端只能查看自己上传的图片,可以用Django的Session(需要客户端支持Cookie):

from rest_framework.views import APIView
from rest_framework.response import Response
from .serializers import ImgSerializer
from rest_framework import status
from rest_framework.parsers import FileUploadParser
from django.core.files.storage import FileSystemStorage
from django.conf import settings

class ImageAPI(APIView):
    parser_classes = (FileUploadParser,)
    # Session键名
    SESSION_KEY = "user_latest_image"
    
    def post(self, request):
        uploaded_file = request.data.get('image')
        if not uploaded_file:
            return Response({"error": "Please upload an image"}, status=status.HTTP_400_BAD_REQUEST)
        
        fs = FileSystemStorage(location=settings.PRIVATE_STORAGE_ROOT)
        filename = fs.save(uploaded_file.name, uploaded_file)
        
        # 将文件名存入当前客户端的Session
        request.session[self.SESSION_KEY] = filename
        
        serializer = ImgSerializer({"image_name": filename})
        return Response(serializer.data, status=status.HTTP_201_CREATED)
    
    def get(self, request):
        # 从当前Session中获取文件名
        latest_image_name = request.session.get(self.SESSION_KEY)
        if not latest_image_name:
            return Response({"error": "No image uploaded from your session yet"}, status=status.HTTP_404_NOT_FOUND)
        
        serializer = ImgSerializer({"image_name": latest_image_name})
        return Response(serializer.data, status=status.HTTP_200_OK)

验证你的序列化器

你的ImgSerializer已经完全符合需求,无需修改:

from rest_framework import serializers

class ImgSerializer(serializers.Serializer):
    image_name = serializers.CharField()

现在你可以:

  1. 用POSTMAN发送POST请求上传图片,会返回{"image_name": "你的文件名"}
  2. 在浏览器中访问/api/(GET方法),就能看到最近上传的图片名称

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 08:45:25