python小白520 2022-05-11 19:37 采纳率: 0%
浏览 111

我在django前端模板中使用ajax发送post请求,数据是用serialize来发送的,然后后端接收不到数据,但如果发送get请求,便可以得到数据

后端视图代码:

def register(request):
    print(request.POST)
    if request.method == 'POST':
        form = RegModelForm(request.POST)        #自定义了一个form组件,继承ModelForm
        if not form.is_valid():
            return JsonResponse({'status': False, 'errors': form.errors})
        form.save()
        return JsonResponse({'status': True})

    form = RegModelForm()
    return render(request, 'register.html', {"form": form})

前端模板的htm代码:

<form id="regForm" method="post">
            {% csrf_token %}
            {% for item in form %}
                {% if item.name == 'code' %}
                    <div class="form-group ">
                        <label for="id_code">{{ item.label }}:</label>
                        <div class="clearfix">
                            <div class="col-md-6" style="padding-left: 0;">{{ item }}</div>
                            <div class="col-md-4">
                                <input type="button" class="btn btn-default code-btn" value="点击获取验证码">
                                </input>
                                <p class="error-msg"></p>
                            </div>
                        </div>
                    </div>
                {% else %}
                    <div class="form-group">
                        <label for="id_{{ item.name }}">{{ item.label }}:</label>
                        {{ item }}
                        <p class="error-msg"></p>
                    </div>
                {% endif %}
            {% endfor %}
          <input type="button" class="btn btn-default reg-btn" value="注册"></input>
</form>

js代码(发送ajax)

<script>
$(".reg-btn").click(function () {
            $('.error-msg').empty();
            $.ajax({
                url: '/register/',
                type: 'post',
                data: $('#regForm').serialize(),    //收集表单中的每一个数据
                success: function (data) {
                    if (data.code == 200) {
                        location.href = '/index/'
                    } else {
                        $.each(data.errors, function (field, error) {
                            $('#id' + field).next().html(error[0])
                        });
                    }
                },
            })
        })
</script>

然后如果我使用ajax发送get请求,后端可以接收数据:

<QueryDict: {'csrfmiddlewaretoken': ['Rf1XbV11Yrs7OSCzSEne0mClwCmzb2ooKyj8i1cvDPJOAVTMamALezeOegcnCW6Y'], 'name': ['zhangsan'], 'email': ['1122@11'], 'pwd': ['1234'], 're_pwd': ['1234'], 'tel': ['468468'], 'code': ['23400']}>
[11/May/2022 19:24:29] "GET /register/?csrfmiddlewaretoken=Rf1XbV11Yrs7OSCzSEne0mClwCmzb2ooKyj8i1cvDPJOAVTMamALezeOegcnCW6Y&name=zhangsan&email=1122%4011&pwd=1234&re_pwd=1234&tel=468468&code=23400 HTTP/1.1" 200 7256

但是如果使用ajax发送post请求,后端接收不到数据,然后就报403错误:

Forbidden (CSRF token missing or incorrect.): /register/
[11/May/2022 19:28:01] "POST /register/ HTTP/1.1" 403 2514

按道理说get请求里面就带有csrf的值,那么数据就没有问题,但是现在报了403错误,就说明数据在发送post请求时没有发送到后端,百度了比较多,也见到过这样的问题

  • 写回答

1条回答 默认 最新

  • ~白+黑 Python领域新星创作者 2022-05-12 11:19
    关注

    建议你看一下官方文档有关于csrf和ajax的配置问题,相信你会找到答案
    https://docs.djangoproject.com/zh-hans/4.0/ref/csrf/

    评论

报告相同问题?

问题事件

  • 创建了问题 5月11日

悬赏问题

  • ¥15 用windows做服务的同志有吗
  • ¥60 求一个简单的网页(标签-安全|关键词-上传)
  • ¥35 lstm时间序列共享单车预测,loss值优化,参数优化算法
  • ¥15 Python中的request,如何使用ssr节点,通过代理requests网页。本人在泰国,需要用大陆ip才能玩网页游戏,合法合规。
  • ¥100 为什么这个恒流源电路不能恒流?
  • ¥15 有偿求跨组件数据流路径图
  • ¥15 写一个方法checkPerson,入参实体类Person,出参布尔值
  • ¥15 我想咨询一下路面纹理三维点云数据处理的一些问题,上传的坐标文件里是怎么对无序点进行编号的,以及xy坐标在处理的时候是进行整体模型分片处理的吗
  • ¥15 一直显示正在等待HID—ISP
  • ¥15 Python turtle 画图