Django DRF如何通过POST请求获取文件响应
实现方案
原有代码问题排查
- 缩进错误:
@api_view装饰器对应的函数缩进多了一层,且@api_view装饰的是函数视图,不需要self参数 - 拼写错误:GET判断逻辑里的
request.methode拼写错误,正确写法为request.method - 逻辑冗余:序列化器调用
save()后已经返回了刚保存的实例,不需要再额外查询最新上传的文件 - 响应格式错误:参数校验失败时用
HttpResponse返回字典会出现格式异常,需统一用DRF提供的Response - 缺失核心逻辑:没有对接OCR识别的处理步骤,也没有生成识别结果文件的逻辑
完整实现步骤
1. 依赖安装
先安装所需依赖包:
pip install django djangorestframework pillow pytesseract python-docx
注意:pytesseract需要提前安装本地Tesseract OCR引擎,Windows系统需手动安装并配置环境变量,Linux系统可执行apt install tesseract-ocr安装,Mac系统可执行brew install tesseract安装
2. 模型定义(models.py)
from django.db import models class UploadImage(models.Model): # 存储原始上传图片 image = models.ImageField(upload_to='upload_images/') # 存储OCR识别结果文件 ocr_result_file = models.FileField(upload_to='ocr_results/', null=True, blank=True) created_at = models.DateTimeField(auto_now_add=True)
3. 序列化器定义(serializers.py)
from rest_framework import serializers from .models import UploadImage class UploadImageSerializer(serializers.ModelSerializer): class Meta: model = UploadImage fields = ['id', 'image', 'ocr_result_file', 'created_at'] read_only_fields = ['ocr_result_file', 'created_at']
4. OCR处理工具函数(utils.py)
import pytesseract from docx import Document import os from django.conf import settings def ocr_process(image_path, output_file_name): # 识别图片文字,支持中英文混合识别 text = pytesseract.image_to_string(image_path, lang='chi_sim+eng') # 生成docx格式的识别结果文件,也可根据需求修改为txt等其他格式 doc = Document() doc.add_paragraph(text) output_dir = os.path.join(settings.MEDIA_ROOT, 'ocr_results') os.makedirs(output_dir, exist_ok=True) output_path = os.path.join(output_dir, f"{output_file_name}.docx") doc.save(output_path) # 返回结果文件的相对路径 return f"ocr_results/{output_file_name}.docx"
5. 修正后的视图代码(views.py)
from rest_framework.decorators import api_view from rest_framework.response import Response from rest_framework import status from .models import UploadImage from .serializers import UploadImageSerializer from .utils import ocr_process import os from django.conf import settings @api_view(['GET', 'POST']) def image_ocr_view(request): if request.method == 'POST': serializer = UploadImageSerializer(data=request.data) if serializer.is_valid(): # 保存上传的原始图片 image_instance = serializer.save() # 执行OCR识别逻辑 image_path = os.path.join(settings.MEDIA_ROOT, image_instance.image.name) output_file_name = f"ocr_result_{image_instance.id}" ocr_file_rel_path = ocr_process(image_path, output_file_name) # 保存OCR结果文件路径到数据库 image_instance.ocr_result_file = ocr_file_rel_path image_instance.save() # 返回结果,包含OCR结果文件的访问地址 return Response(UploadImageSerializer(image_instance).data, status=status.HTTP_201_CREATED) return Response({'message':'参数错误,请上传合法的图片文件'}, status=status.HTTP_400_BAD_REQUEST) elif request.method == 'GET': # 返回所有上传记录,可根据需求调整为分页、单条查询等逻辑 images = UploadImage.objects.all() serializer = UploadImageSerializer(images, many=True) return Response(serializer.data)
6. 路由配置(urls.py)
from django.urls import path from . import views from django.conf import settings from django.conf.urls.static import static urlpatterns = [ path('ocr/upload/', views.image_ocr_view, name='image-ocr-upload'), ] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT) # 开放媒体文件访问权限
测试方法
发送POST请求,将图片放在file字段上传到/ocr/upload/接口,返回结果中的ocr_result_file字段就是识别结果文件的访问地址,直接访问即可下载结果文件。
内容的提问来源于stack exchange,提问作者Rihab sabri
相关产品推荐
相关产品推荐

