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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.09 18:45:05