jquery 如何使用 AJAX 和Dango将数据从前端发送到后端?

wgxvkvu9  于 2022-11-03  发布在  jQuery
关注(0)|答案(1)|浏览(162)

INTRO:我正在编写一个Django应用程序,它需要将一些数据从前端发送到后端的views.py文件中。为此,我有一个按钮,当点击它时,它会执行一个事务。它看起来如下:

<button id="submit_transaction" type="button" class="btn btn-outline-info" onclick="transaction()">Transaction</button>

问题:单击时,按钮会触发一个名为transaction()的函数,该函数执行异步操作,如下所示:

<script>
    async function transaction(){
    // Perform some task

    // Submit transaction
    $.ajax({
          type: 'POST',
          data : {
              'public_key': public_key,
          },
          success: function(res){
            console.log(res);
          }
        });
    }
</script>

在这个异步函数中,有一个 AJAX 调用,它将一些数据收集到一个变量中,然后通过post请求将其发送到后端(如这里所建议的link)。
但是,当我单击该按钮时,弹出以下错误:
未捕获(在承诺中)TypeError:非法调用

问题:你知道我做错了什么吗?或者你能建议一个聪明而优雅的解决方案,将一些数据从前端发送到后端吗?

but5z9lq

but5z9lq1#

您需要提供URL

<script>

    body = {
        'csrfmiddlewaretoken': crsfToken,
        'public_key': ...
    }

    async function transaction(){
    // Perform some task

    // Submit transaction
    $.ajax({
          url: 'https://mysite',
          type: 'POST',
          data : body,
          success: function(res){
            console.log(res);
          }
        });
    }
</script>

如果你想让你的django视图接受请求,你还必须提供csrf_token(或者使用csrf_exempt,这是不太安全的)
我建议在 AJAX 上使用Request标准JS库,因为Request是原生的。https://developer.mozilla.org/en-US/docs/Web/API/Request/Request
下面是一个如何使用Request的示例:

/**
     * Send some data to create an object in my db.
     * @param data what's created.
     * @returns {*} what was created server-side.
     */
    async create(data) {
        let res = await fetch(new Request('https://my.create.url', {
            method: 'POST',
            body: data,
            headers: {
                'X-CSRFToken': this.csrfToken,
                'Content-Type': "application/x-www-form-urlencoded" // required if you want to use request.POST in django
            }
        }));
        if (res.status === 201) {
            return res.text(); // Status (because I return HttpResponse(status=201) )
        }
        if (res.status === 400) {
            throw new InvalidFormError("form invalid", await res.text());
        }
        throw new Error(await res.text()); // You have to handle it afterward
    }

相关问题