获取请求不在json内容类型中

2024-05-15 15:55:02 发布

您现在位置:Python中文网/ 问答频道 /正文

我正试图在网站上的一条路径上获取json格式的sqlite数据库数据,这是可以预期的,如果我要访问chrome devtools中网络选项卡上的链接,它会说de内容类型是application/json。这当然是我想要的,除非我用javascript向这个特定的路由发出XMLGET请求,它会显示数据类型:text/html。有人知道如何解决这个问题吗?python代码:

@app.route('/dossiers/all', methods=['GET'])
@login_required
def get_all_dosssiers():
    ids = executeQueryResult('SELECT dossierid FROM dossiers', [])
    # return jsonify(ids)
    print(ids[1].get('DossierId'))

    results = []
    for id in ids:
        results.append(get_dossier(id.get('DossierId')))
    return jsonify(results)

JS:

var request = new XMLHttpRequest()
request.open('GET', `http://127.0.0.1:5000/dossiers/all`, true)
request.onload = function () {
  // Begin accessing JSON data here
  var data = JSON.parse(this.response)
  if (request.status >= 200 && request.status < 400) {
    data.forEach((dossier) => {
      const card = document.createElement('button')
      card.setAttribute('class', 'card')

      const kruisje = document.createElement('button')
      kruisje.setAttribute('class', 'kruisje')

      const h1 = document.createElement('h1')
      h1.textContent = dossier.ziekte

      const p = document.createElement('p')
      dossier.description = dossier.description.substring(0, 300)
      p.textContent = `${dossier.behandeling}...`

      const id = dossier.dossierId

      container.appendChild(card)
      card.appendChild(kruisje)
      card.appendChild(h1)
      card.appendChild(p)

      card.addEventListener("click", function() {
        window.location = `dossier.html?id=${dossier.id}`
      })
    })
  } else {
    const errorMessage = document.createElement('p')
    errorMessage.textContent = `Het werkt niet...`
    app.appendChild(errorMessage)
  }
}

Tags: ididsgetrequestallcardh1document
1条回答
网友
1楼 · 发布于 2024-05-15 15:55:02

它可以是一些东西,很难说从你的描述中到底是什么

  1. CORS。根据您是以localhost的形式打开一个,还是以127.0.0.1的形式请求另一个,您可能需要设置^{}

  2. 根据login_requireddecorator的工作方式,当您未经身份验证时,可能会有HTML登录页

  3. 如果您正在运行Flask < 0.11,那么^{}在传递list时不会运行

    Changed in version 0.11: Added support for serializing top-level arrays. This introduces a security risk in ancient browsers. See JSON Security.

    基本上,获取JSON资源时Array.prototype重写的漏洞只存在于古老的浏览器中,根列表可以使用。两个带有^{}的示例。我在{}中有这个

    from flask import Flask, jsonify
    
    app = Flask(__name__)
    
    @app.route('/dossiers', methods=['GET'])
    def dossiers():
        return jsonify([{'foo': 'bar'}])
    
    if __name__ == '__main__':
        app.run()
    
    • pex "flask < 0.11" app.py

      $ curl -v localhost:5000/dossiers
      *   Trying 127.0.0.1...
      * Connected to localhost (127.0.0.1) port 5000 (#0)
      > GET /dossiers HTTP/1.1
      > Host: localhost:5000
      > User-Agent: curl/7.47.0
      > Accept: */*
      > 
      * HTTP 1.0, assume close after body
      < HTTP/1.0 500 INTERNAL SERVER ERROR
      < Content-Type: text/html; charset=utf-8
      < Content-Length: 290
      < Server: Werkzeug/2.0.1 Python/3.7.10
      < Date: Mon, 24 May 2021 13:05:12 GMT
      ...
      
    • pex "flask >= 0.11" app.py

      $ curl -v localhost:5000/dossiers
      *   Trying 127.0.0.1...
      * Connected to localhost (127.0.0.1) port 5000 (#0)
      > GET /dossiers HTTP/1.1
      > Host: localhost:5000
      > User-Agent: curl/7.47.0
      > Accept: */*
      > 
      * HTTP 1.0, assume close after body
      < HTTP/1.0 200 OK
      < Content-Type: application/json
      < Content-Length: 16
      < Server: Werkzeug/2.0.1 Python/3.7.10
      < Date: Mon, 24 May 2021 13:07:18 GMT
      < 
      [{"foo":"bar"}]
      * Closing connection 0
      

相关问题 更多 >