2017-10-17 75 views
2

我做了一些基本的代码来解释我的问题:如何在Python3中正确生成并使用UTF-8 json? (用瓶和请求)

produceUTF8.py(回复“它的工作!” Unicode字符) - 运行此第一

# -*- coding: utf-8 -*- 
import os 
from sys import argv 

from flask import Flask, request, Response, jsonify 
import json 

app = Flask(__name__) 
app.config['JSON_AS_ASCII'] = False # contribution from Erdem 

@app.route('/reply', methods=['POST']) 
def reply(): 
    """Fetch a reply 
    """ 
    print("DEBUG entered") 
    params = request.json 
    print("DEBUG entered2") 
    if not params: 
     return jsonify({ 
      'status': 'error', 
      'error': 'Request must be of the application/json type!', 
     }) 

    reply = "ít wórked!" 

    # Send the response. 
    return jsonify({ 
     'status': 'ok', 
     'reply': reply, 
    }) 

if __name__ == '__main__': 
    app.run(host='0.0.0.0', debug=True) 

consumeUTF8.py(职位信息“伊亚”,以获得生产的答案)

# -*- coding: utf-8 -*- 
import requests 

HEADERS = {'Content-Type': 'application/json; charset=utf-8',} 
DATA = '{"message": "óíá"}' 
my_request = requests.post('http://localhost:5000/reply', headers=HEADERS, data=DATA) 
response = my_request.json()['reply'] 

在我的制片人,我收到“错误的请求(400)”和消费者的“json.decoder.JSONDecodeError:期待值:第1行第1列(char 0)“。

这似乎是在调试打印中看到的params = request.json中的问题。这里推荐的方法是什么?

谢谢!

回答

1

您可以修复你通过编码data对象发出请求的方式:

my_request = requests.post('http://localhost:5000/reply', 
          headers=HEADERS, 
          data=DATA.encode('utf-8')) 

#>>> ít wórked with óíá! 

如果您在应用程序中添加一个try/except语句,它返回:

try: 
    params = request.json 
except Exception as e: 
    params = None 
    print(e) 

400 Bad Request: Failed to decode JSON object: 'utf-8' codec can't decode byte 0xf3 in position 14: invalid continuation byte

您可以使用此模式为param指定默认值

+0

它停止了错误的请求!谢谢..我会在邮递员代码片段生成器上创建一个问题来添加这个编码部分=) – StaticX

1

我没有尝试过的代码,但可设置

app.config['JSON_AS_ASCII'] = False 

可能会有帮助。

+0

现在它在邮件管理器上以UTF-8响应,但它仍然从consumeUTF8.py中收到错误请求(400)。我用你的贡献编辑了代码,谢谢!更令人疯狂的是,我使用request和http.client从Postman生成片段,他们也得到相同的错误! – StaticX

相关问题