如何在烧瓶中通过POST请求传递西里尔符号

时间:2019-02-15 08:54:36

标签: json post flask windows-1251

我有这样一条路线:

@app.route('/wikidata/api/v1.0/ask', methods=['POST'])
def get_tasks():

    print(request.data)
    print(request.json)
    return jsonify(1)

我发送了一个请求

curl -i -H "Content-Type:application/json" -X POST -d "{\"название\": \"значение?\",\"param1\": \"Q29424\"}" http://localhost:8529/wikidata/api/v1.0/ask

并得到错误:

HTTP/1.0 400 BAD REQUEST
Content-Type: text/html
Content-Length: 223
Server: Werkzeug/0.14.1 Python/3.6.5
Date: Fri, 15 Feb 2019 08:34:27 GMT

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
<title>400 Bad Request</title>
<h1>Bad Request</h1>
<p>Failed to decode JSON object: 'utf-8' codec can't decode byte 0xed in position 2: invalid continuation byte</p>

同时print(request.data)显示request.datab'{"\xed\xe0\xe7\xe2\xe0\xed\xe8\xe5": "\xe7\xed\xe0\xf7\xe5\xed\xe8\xe5?","param1": "Q29424"}'

到目前为止唯一有用的是

decoded_data = request.data.decode('windows-1251')
question = json.loads(decoded_data)

我正在寻找一种正确发送请求(或配置服务器)的方法,以便我可以毫无错误地使用request.json

谢谢。

1 个答案:

答案 0 :(得分:0)

这是Windows特有的问题,可能是由于Windows控制台提示符中的默认字符集所致。命令行中的西里尔字符被与UTF-8不兼容的字符集误解。

由于您已经使用Python,因此IMHO发送请求的最简单方法是使用requests模块(您可以使用pip install requests安装)。然后使用UTF-8作为字符集在python文件中键入以下命令:

import requests
requests.post("http://localhost:8529/wikidata/api/v1.0/ask", json={"название": "значение?","param1": "Q29424"})

运行它,它将与您的curl命令行具有相同的效果,仅在正确处理西里尔字符的情况下。