当前位置: 首页 > 面试题库 >

Flask和Ajax Post请求400

戚阳
2023-03-14
问题内容

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

这是烧瓶侧的接收器,我将其简化为仅记录一条消息,以避免在此路由的实现中出现任何不必要的错误:

@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保护,则需要免除您的视图或将CSRF令牌也包含在AJAX POST请求中。

豁免是通过装饰器完成的:

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

要将令牌包含在AJAX请求中,请将令牌内插到页面中的某个位置;在<meta>标题或生成的JavaScript中,然后设置X-CSRFToken标题。使用jQuery时,请使用ajaxSetuphook。

使用元标记的示例(来自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(数据将最终在request.formFlask一侧);您必须将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) {
})

现在的数据可以作为一个Python结构与访问request.get_json()方法。

dataType: "json",参数$.ajax时,你的看法是只需要 返回
JSON(例如,你使用flask.json.jsonify()产生JSON响应)。它使jQuery知道如何处理响应。



 类似资料:
  • 来自客户端网页的数据作为全局请求对象发送到服务器。要处理请求数据,请求对旬应该从Flask模块导入。 请求对象的重要属性如下所列 - - 它是包含表单参数及其值的键和值对的字典对象。 - 解析问号()后的URL部分查询字符串的内容。 - 保存Cookie名称和值的字典对象。 - 与上传文件有关的数据。 - 当前请求方法。

  • 问题内容: 我想在flask应用程序中发送本地REST请求,如下所示: 发送导致整个烧瓶应用程序冻结。当发送终止信号时,出现管道错误。有什么办法可以防止烧瓶冻结? 问题答案: 在能够处理并发请求(可能是gunicorn或uWSGI)的适当WSGI服务器下运行flask应用程序,它将起作用。在开发时,请使用以下命令在Flask提供的服务器中启用线程: 但请注意,不建议将Flask服务器用于生产环境。

  • 问题内容: 有没有一种方法可以将Flask请求对象注入到其他Flask应用中。这就是我想要做的: 我正在尝试使用Google Cloud Functions,这是由云运行时调用的函数。它接收一个作为参数,然后我要通过自己的一组路由进行处理。 我尝试了以下操作,但不起作用: 对于所有请求,这将返回404错误。 编辑: 实现的简单方法如下: 这本质上要求我自己编写路由匹配逻辑。我想知道是否有一种避免这

  • 问题内容: 我有一个烧瓶应用程序,具有以下视图: 但是,这仅在请求的内容类型设置为时才有效,否则dict 为None。 我知道请求主体为字符串,但我不想每次客户端忘记设置请求的内容类型时都将其解析为字典。 有没有办法假设每个传入请求的content- type是?我想要的就是始终访问有效的字典,即使客户端忘记将应用程序的内容类型设置为json。 问题答案: 使用并设置为: 从文档中: 默认情况下,

  • 问题内容: 我的Flask应用程序必须进行大量计算才能获取特定页面。在Flask执行该功能时,其他用户无法访问该网站,因为Flask忙于进行大量计算。 有什么方法可以使我的Flask应用程序接受来自多个用户的请求? 问题答案: 是的,将应用程序部署在其他WSGI服务器上,请参阅Flask部署选项文档。 Flask随附的服务器组件实际上仅用于开发应用程序时;即使可以将其配置为处理并发请求(从Flas

  • 问题内容: 我从html中接收来自用户的一堆输入,然后将其传递给ajax查询以获取响应。 这是满足上述要求的Flask代码。 上面的方法无法通过get找到到“报告”的路线。但是,它可以在POST请求中找到它。 这是我得到的日志 错误的请求..我在这里做错了什么? 问题答案: GET请求没有 (*),并且不是JSON编码的,而是URL编码的(普通,常规键值对)。 这意味着您可以简单地使用jQuery