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

Postman form-data请求正常 raw及服务端无法发送注册令牌问题

问题原因

后端使用Django原生View时,request.POST.get('email')的写法仅能解析application/x-www-form-urlencoded、multipart/form-data(即Postman的form-data格式)的请求参数,无法读取application/json格式(Postman raw JSON、前端默认发送的JSON请求)的传参。此时取到的data值为None,自然无法正常创建用户、发送验证邮件。

修复方案

1. 后端代码调整

Django默认不会自动解析JSON格式请求体,需要手动从request.body加载JSON数据后再取参,同时顺手优化下原有代码的冗余逻辑:

import json
from django.http import JsonResponse
from django.views import View
from django.core.mail import send_mail
from .models import Registration

class RegisterView(View):
    def post(self, request, *args, **kwargs):
        # 同时兼容JSON和form-data两种传参格式
        if request.content_type == "application/json":
            body_data = json.loads(request.body)
            data = body_data.get('email')
        else:
            data = request.POST.get('email')

        # 优化原有全表查询逻辑,直接判断邮箱是否存在效率更高
        if Registration.objects.filter(email=data).exists():
            return JsonResponse('Email already provided', safe=False, status=200)
        
        # create方法本身会完成数据库写入,不需要额外调用save()
        new_user = Registration.objects.create(email=data)
        content = {'code': new_user.code}
        send_mail(
            "Thanks for Registering",
            f'Here is your signup Token:{content}',
            'djangod192@gmail.com',
            [data],
            fail_silently=False,
        )
        return JsonResponse(content, status=201)

如果后续接口都统一用JSON传参,也可以直接用Django REST Framework的APIView,框架会自动解析JSON请求体,直接通过request.data就能拿到参数,不用手写解析逻辑。

2. 前端代码补全

现有前端逻辑没有等待接口返回就直接跳转路由,也没有错误捕获,很容易出现接口请求失败但用户已经进入下一步的问题,调整请求部分代码即可:

const sendVerificationCode = async (event) => {
    event.preventDefault();
    if (email.length > 0) {
        const data = {
            email: email
        };
        const fetchConfig = {
            method: 'POST',
            headers: new Headers({
                "Content-Type": "application/json",
            }),
            body: JSON.stringify(data),
        };
        try {
            const response = await fetch(url,fetchConfig)
            const res = await response.json()
            // 可在此处增加接口返回状态校验,确认验证码发送成功再跳转
            const action = {
                type:"setEmail",
                payload:email
            };
            dispatch(action)
            navigate("/SignUpStep2")
        } catch (err) {
            alert("验证码发送失败,请稍后重试")
        }
    } else {
        alert("please enter email address");
    }
}

修改完成后,用Postman选择raw+JSON格式传入{"email":"测试邮箱地址"}即可正常收到邮件,前端发起的请求也能正常触发邮件发送逻辑。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 22:39:19