使用 jQuery AJAX 修复 Django 中的“未提供图像”错误和 400 31 响应

AJAX

对 Django 和 jQuery 中的图像上传进行故障排除

使用 Django 和 jQuery 构建 Web 应用程序时,处理文件上传(例如图像)有时会带来挑战。开发人员遇到的一个常见问题是服务器在尝试通过 AJAX 请求上传图像时返回错误。这些错误可能会令人沮丧,尤其是当前端似乎工作正常,但后端拒绝处理文件时。

此问题通常表现为 HTTP 400 响应,并包含“未提供图像”等消息,让开发人员想知道出了什么问题。这种情况下,问题就在于前端如何将图像数据发送到服务器。确保前端和后端之间的正确通信对于顺利处理文件至关重要。

在本文中,我们将探讨一个现实场景,其中通过 AJAX 上传图像由于“未提供图像”错误和 Django 中的 400 31 响应代码而失败。我们将检查前端和后端代码,以确定根本原因并提出解决问题的解决方案。

在本指南结束时,您将清楚地了解如何使用 jQuery 正确地将图像文件发送到 Django 服务器,确保您的文件上传请求成功处理且没有错误。

命令 使用示例
FormData() 此命令创建一个新的 FormData 对象,使您可以轻松构建一组键/值对以通过 AJAX 发送数据,包括图像等文件。它在处理文件上传时至关重要,因为它可以正确格式化数据以进行传输。
processData: false 在 jQuery 的 AJAX 设置中,此命令可确保发送的数据不会被处理或转换为查询字符串。这在发送 FormData 对象时至关重要,因为它们包含文件,必须以其原始形式发送。
contentType: false 这告诉服务器不要自动设置 Content-Type 标头。上传文件时这是必要的,因为浏览器需要生成正确的多部分表单数据内容类型边界来发送文件数据。
request.FILES 在Django中,request.FILES是一个类似字典的对象,包含所有上传的文件。它是处理文件上传的关键,因为它允许访问从客户端发送的图像或文档文件。
SimpleUploadedFile() 这在Django的测试框架中用于模拟文件上传。它创建一个模拟实际文件上传的简单文件对象,允许开发人员为图像上传等文件处理视图编写单元测试。
JsonResponse() 用于返回 JSON 格式的 HTTP 响应的 Django 方法。在此上下文中,它用于将错误消息或成功数据发送回客户端,对于需要 JSON 数据的 AJAX 请求特别有用。
@csrf_exempt Django 中的这个装饰器用于使视图免受 CSRF 保护机制的影响。虽然它在快速开发或测试期间很有用,但应谨慎使用,因为它可能会使应用程序面临安全风险。
readAsDataURL() FileReader API 中的 JavaScript 方法,用于读取文件内容并将其编码为 base64 数据 URL。它用于在将图像发送到服务器之前在客户端显示图像。
append() FormData 对象中的此方法允许将键/值对添加到表单数据。它对于附加文件至关重要,如在通过 AJAX 发送图像文件之前将图像文件附加到表单时所演示的那样。

了解 Django 中的 AJAX 图像上传过程

上面提供的脚本解决了通过 AJAX 将图像上传到 Django 后端进行进一步处理时的常见问题。这里的主要挑战是将文件数据以正确的格式发送到服务器,同时确保适当的安全措施(例如 CSRF 保护)。前端使用 处理图像上传。图像是从输入元素中选择的,并且 API用于向用户显示图像预览。通过在处理图像之前在网页上显示图像,可以创建更具交互性的用户体验。

选择图像后,用户可以单击按钮来处理图像。此时,jQuery 函数将图像发送到 Django 后端。该脚本现在不只是发送图像文件名,而是使用 将实际文件与其他必要的表单数据(包括 CSRF 令牌)一起附加。这 和 内容类型: false AJAX 请求中的设置可确保数据不会转换为查询字符串,这对于正确将文件传输到服务器至关重要。

在后端,Django 视图使用 访问上传​​的图像。该对象存储通过表单上传的所有文件。该视图检查图像是否存在,然后使用机器学习模型对其进行处理。如果图像丢失,服务器会响应“未提供图像”错误消息,并触发 400 状态代码。这可确保正确处理无效或空请求,从而有助于实现更安全、更稳健的 API 通信。

这些脚本还处理错误日志记录和响应处理 。如果图像处理成功,则返回 200 状态代码。如果处理过程中出现问题,则会发送一条带有 500 状态代码的错误消息。此外,测试套件脚本使用 在单元测试期间模拟文件上传。这有助于验证视图是否正确处理不同环境中的图像文件,确保整个流程在各种场景和平台上按预期工作。

在 Django + jQuery 中使用 FormData 解决“未提供图像”错误

这种方法涉及使用 FormData 通过 jQuery 中的 AJAX 正确发送图像文件,以供 Django 后端处理。

// jQuery Script with FormData to send the image correctly
$(document).ready(() => {
    $("input[id='image']").on('change', function(event) {
        let input = this;
        var reader = new FileReader();
        reader.onload = function(e) {
            $('#banner').css('width', '350px')
            $('#banner').addClass('img-thumbnail')
            $('#banner').attr('src', e.target.result);
        }
        reader.readAsDataURL(input.files[0]);
    });

    $('#process').click(() => {
        let image = $('#image').prop('files')[0];
        let formData = new FormData();
        formData.append('image', image);
        formData.append('csrfmiddlewaretoken', '{{ csrf_token }}');

        $.ajax({
            url: "/api/",
            type: "POST",
            data: formData,
            processData: false,  // Required for FormData
            contentType: false,  // Required for FormData
            success: function(xhr) {
                alert("Image processed successfully!");
            },
            error: function(xhr) {
                console.log(xhr.responseText);
                alert("Error occurred while processing the image.");
            }
        });
    });
});

Django 中处理图像上传的后端解决方案

此 Django 视图使用 request.FILES 处理图像上传,并安全地处理图像,并进行错误处理。

from django.shortcuts import render
from django.http import JsonResponse, HttpResponse
from django.views.decorators.csrf import csrf_exempt
from diab_retina_app import process

@csrf_exempt
def process_image(request):
    if request.method == 'POST':
        img = request.FILES.get('image')
        if img is None:
            return JsonResponse({'error': 'No image provided.'}, status=400)

        try:
            response = process.process_img(img)
            return HttpResponse(response, status=200)
        except ValueError as e:
            return JsonResponse({'error': str(e)}, status=500)

Django 中图像上传的单元测试

该Python脚本使用Django的测试框架来模拟文件上传并验证后端图像处理。

from django.test import TestCase, Client
from django.core.files.uploadedfile import SimpleUploadedFile

class ImageUploadTest(TestCase):
    def setUp(self):
        self.client = Client()

    def test_image_upload(self):
        # Create a fake image for testing
        img = SimpleUploadedFile("test_image.jpg", b"file_content", content_type="image/jpeg")

        response = self.client.post('/api/', {'image': img}, format='multipart')

        self.assertEqual(response.status_code, 200)
        self.assertIn("Result", response.content.decode())

解决 AJAX 和 Django 中的文件上传问题

在许多 Web 应用程序中,尤其是那些集成机器学习模型的 Web 应用程序中,文件上传很常见。开发人员面临的一项挑战是确保图像或文件正确地从客户端发送到服务器。这涉及到处理 有效地请求,确保文件以服务器可以处理的方式传输。此流程中的一个关键因素是使用正确的格式发送图像文件。这 对象起着至关重要的作用,允许在 Django 中附加文件并与其他数据(例如 CSRF 令牌)无缝传输。

另一个需要理解的关键点是 Django 生态系统中前端和后端组件之间的交互。当使用 AJAX 向服务器发送图像时,前端必须确保数据不会编码为查询字符串,这可能会破坏文件上传。在 Django 方面, 字典必须正确捕获上传的文件。开发人员常犯的一个错误是没有在 AJAX 调用上设置适当的标头或配置,从而导致“未提供图像”等错误。

此外,优化前端和后端的错误处理有助于确保流畅的用户体验。正确捕获和记录错误可以有效地调试和解决问题。通过实施彻底的测试,特别是使用诸如 在Django的测试套件中,开发人员可以验证其文件上传功能并确保系统在不同环境和场景下正确运行。这种方法提高了性能和可靠性,特别是对于处理大型图像或数据文件的应用程序。

  1. 为什么我收到“未提供图像”错误?
  2. 最常见的原因是图像未正确附加到 AJAX 请求中的对象。确保您使用 以包含图像文件。
  3. 什么是 在姜戈?
  4. 是 Django 中的字典,保存通过表单上传的所有文件,允许后端处理文件。
  5. 如何在 AJAX 请求中附加文件?
  6. 你需要创建一个 对象并使用 方法在通过 AJAX 发送文件之前添加文件。
  7. 为什么我需要 在阿贾克斯?
  8. 确保 AJAX 请求中发送的数据不会被处理为查询字符串,这对于文件上传至关重要。
  9. 如何在 Django 中测试图像上传?
  10. 您可以使用 Django 的测试框架以及 模拟文件上传并验证后端逻辑。

在 Django 中通过 AJAX 处理图像上传时,确保前端将图像作为表单数据的一部分正确传输至关重要。使用 无需转换为字符串即可正确发送文件,解决图片丢失的问题。

在后端,Django 的 必须用于检索上传的文件。调试至关重要,仔细关注文件处理过程可以解决大多数错误,使图像上传和处理按预期进行,不会出现 400 错误。

  1. 有关处理文件上传的更多详细信息 可以在官方文档中找到: Django 文件上传
  2. 如需了解更多信息 处理文件上传,参考jQuery文档: jQuery AJAX API
  3. 欲了解更深入的见解 和 Django 的安全实践,请访问: Django CSRF 保护
  4. 这 object 是解决这个问题的关键,在 MDN 上有详细记录: MDN 表单数据 API
  5. 探索最佳实践 JavaScript 中的错误处理位于: SitePoint AJAX 处理