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()
现在你可以:
- 用POSTMAN发送POST请求上传图片,会返回
{"image_name": "你的文件名"} - 在浏览器中访问
/api/(GET方法),就能看到最近上传的图片名称
内容的提问来源于stack exchange,提问作者retro_coder
相关产品推荐
相关产品推荐

