cURL命令返回400 Bad请求错误

时间:2017-11-20 13:28:25

标签: python postgresql curl flask flask-sqlalchemy

我使用postgres从postgres数据库中获取数据。所以创建flask api但是当我使用curl命令时它会返回400错误的请求错误。 这是我的代码 -

from flask import Flask, render_template, request, Response
import psycopg2
import csv
import json
from psycopg2.extras import RealDictCursor
import requests

conn = psycopg2.connect("host='localhost' dbname='postgres' user='postgres'")
app = Flask(__name__)

@app.route('/', methods = ['GET','POST'])
def index():
    cur = conn.cursor(cursor_factory=RealDictCursor)
    query = request.form['query']
    cur.execute(query)
    return Response(json.dumps(cur.fetchall(),indent=2),mimetype='application/json')

if __name__ == "__main__":
   app.run(host='0.0.0.0')

conn.close()

我使用这个curl命令 -

curl -H "Content-Type: application/json" -X GET http://127.0.0.1:5000/ -d '{"query":"SELECT COUNT(*) FROM usage"}'

那么如何使用curl与flask api。

1 个答案:

答案 0 :(得分:1)

声明:

你有直接的SQL注入。我建议你解决。

答案:

这不是请求的工作方式。如果要在curl中传递数据,则需要将参数格式化为查询字符串。它不会为您解码JSON。你有几个选择。

修复卷曲:

(注意,我在每个中编码了参数)

重新格式化curl以使用GET参数:

curl 'http://127.0.0.1:5000/?query=SELECT%20COUNT(*)%20FROM%20usage'

按预期将curl重新格式化为POST:

curl -H "Content-Type: application/json" -X POST http://127.0.0.1:5000/ -d 'query=SELECT%20COUNT(*)%20FROM%20usage'

这样您就可以在编写完成后获取上述数据。

解析JSON

这样您就可以继续使用cURL了:

# this is the short version, provided by randomir in the comments.
query = request.json().get('query')

# This is an alternative which roughly does the same thing
dat_str = request.data
dat_dict = json.loads(dat_str)
query = dat_dict['query']