javascript - Flask 和 Ajax 发布 HTTP 400 错误请求错误

标签 javascript jquery python ajax flask

我正在编写一个基于 flask 的小型站点,我想使用 Ajax 将数据从客户端发送到服务器。到目前为止,我只使用 Ajax 请求从服务器检索数据。这次我想通过 POST 请求提交数据。

这是 flask 端的接收器,我将其简化为几乎不记录消息以避免在此路由的实现中出现任何不必要的错误:

@app.route("/json_submit", methods=["POST"])
def submit_handler():
    # a = request.get_json(force=True)
    app.logger.log("json_submit")
    return {}

提交ajax请求时,flask给我一个400错误

127.0.0.1 - - [03/Apr/2014 09:18:50] "POST /json_submit HTTP/1.1" 400 -

我也可以在浏览器的 Web 开发者控制台中看到这个

为什么flask没有使用请求中提供的数据调用submit_handler

 var request = $.ajax({
    url: "/json_submit",
    type: "POST",
    data: {
      id: id, 
      known: is_known
    },  
    dataType: "json",
  })  
   .done( function (request) {
  })

最佳答案

如果您使用的是 Flask-WTF CSRF protection您还需要豁免您的 View 或在您的 AJAX POST 请求中包含 CSRF token 。

使用装饰器进行豁免:

@csrf.exempt
@app.route("/json_submit", methods=["POST"])
def submit_handler():
    # a = request.get_json(force=True)
    app.logger.log("json_submit")
    return {}

要在 AJAX 请求中包含 token ,请将 token 插入到页面中的某处;在 <meta> header 或在生成的 JavaScript 中,然后设置 X-CSRFToken标题。使用 jQuery 时,请使用 ajaxSetup hook .

使用元标记的示例(来自 Flask-WTF CSRF 文档):

<meta name="csrf-token" content="{{ csrf_token() }}">

在你的 JS 代码中某处:

var csrftoken = $('meta[name=csrf-token]').attr('content')

$.ajaxSetup({
    beforeSend: function(xhr, settings) {
        if (!/^(GET|HEAD|OPTIONS|TRACE)$/i.test(settings.type)) {
            xhr.setRequestHeader("X-CSRFToken", csrftoken)
        }
    }
})

您的处理程序实际上还没有发布 JSON 数据;它仍然是一个常规的 url 编码 POST (数据将在 Flask 端以 request.form 结束);您必须将 AJAX 内容类型设置为 application/json并使用 JSON.stringify()实际提交 JSON:

var request = $.ajax({
   url: "/json_submit",
   type: "POST",
   contentType: "application/json",
   data: JSON.stringify({
     id: id, 
     known: is_known
   }),  
})  
  .done( function (request) {
})

现在可以使用 request.get_json() method 作为 Python 结构访问数据.

dataType: "json", $.ajax 的参数仅当您的 View 返回 JSON(例如,您使用 flask.json.jsonify() 生成 JSON 响应)时才需要。它让 jQuery 知道如何处理响应。

关于javascript - Flask 和 Ajax 发布 HTTP 400 错误请求错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22854749/

相关文章:

使用图像 slider 时出现 jQuery 错误?

python - "pipenv install opencv-python"全新 Raspbian 安装失败

php - 选择下拉值以从数据库 mysql 获取填充数据

javascript - 如何隐藏/显示在 ASP.NET 中动态创建的 HTML 元素

jquery - Jquery中的颜色闪烁?

jQuery 点击触发两次但只注册一次

python - 二进制转十进制(数学方式)

python - 是否可以使用 Python/BeautifulSoup 从一大块 HTML 中去除除 anchor /链接之外的所有标签?

javascript - 无法使用 Hubot 将消息发送到 Slack 中的特定 channel - SlackRTMError : no channel id

javascript - 如何在 Javascript 中制作自定义对象?