【发布时间】:2019-04-11 13:56:52
【问题描述】:
我有自己的带有静态 IP 的 HTTP 服务器。在这台服务器上,我正在运行我的烧瓶应用程序以获取来自在 v2 API 上运行的对话流实现的请求。当我用英语使用我的代理时,它会在烧瓶应用程序中正确解析它,但是当我使用俄语时,在烧瓶端我得到包含 ???????? 序列的垃圾输出。
我尝试在对话框中设置 charset = Unicode,但还是不行。
import json,os,sys,logging
from flask import Flask, request
from flask import jsonify
from configparser import ConfigParser
import objectpath
def setup_custom_logger(name):
formatter = logging.Formatter(fmt='%(asctime)s %(levelname)-8s
%(message)s',datefmt='%Y-%m-%d %H:%M:%S')
handler = logging.FileHandler('log.txt', mode='w')
handler.setFormatter(formatter)
screen_handler = logging.StreamHandler(stream=sys.stdout)
screen_handler.setFormatter(formatter)
logger = logging.getLogger(name)
logger.setLevel(logging.DEBUG)
logger.addHandler(handler)
logger.addHandler(screen_handler)
return logger
logger = setup_custom_logger('myapp')
app = Flask(__name__)
@app.route('/flightSearchByRoute', methods=['POST'])
def interactionPredictions():
try:
response = {
"status": 0,
"query": "ERROR"
}
if request.json['result']: #if key doesn't exist, returns None
print("request",request)
print("key output",request.json['queryResult']['queryText'])
print("parsed",json.dumps(request.json,indent=4, sort_keys=True))
toLocation = request.json['queryResult']['parameters']['to']
fromLocation = request.json['queryResult']['parameters']['from']
qTime = request.json['queryResult']['parameters']['time']
outputContexts = request.json['session']#['outputContexts'][0]['name']
print("parameters",fromLocation,toLocation,qTime,outputContexts)
response = { "fulfillmentText": "Success API HIT to: "+toLocation+" from: "+fromLocation+ " time: "+qTime ,"fulfillmentMessages":[ { "text": { "text": [ "Success API HIT to: "+toLocation+" from: "+fromLocation+ " time: "+qTime,] } } ] ,"source":"" }
print(json.dumps(response,indent=4, sort_keys=True))
return jsonify(response),200
except Exception as e:
exc_type, exc_obj, exc_tb = sys.exc_info()
fname = os.path.split(exc_tb.tb_frame.f_code.co_filename)[1]
print(exc_type, fname, exc_tb.tb_lineno, e)
response = {
"status": 0,
"query": "ERROR"
}
return jsonify(response),400
@app.errorhandler(404)
def page_not_found(e):
response = {
"status": 0,
"query": "ERROR"
}
return jsonify(response),400
if __name__ == '__main__':
app.run(host='0.0.0.0',debug=True, port=8888) #run app in debug mode on port 5344
response send from dialog flow:
{
"id": "97feddb0-c24d-4a4e-bec5-5823a3374fb2",
"timestamp": "2019-04-11T13:46:07.884Z",
"lang": "ru",
"result": {
"source": "agent",
"resolvedQuery": "из Лондона в Нью-Йорк 5 утра",
"action": "",
"actionIncomplete": false,
"parameters": {
"time": "05:00:00",
"from": "Лондона",
"to": "Нью-Йорк"
}
response getting at flask end
{
"originalDetectIntentRequest": {
"payload": {}
},
"queryResult": {
"allRequiredParamsPresent": true,
"fulfillmentMessages": [
{
"text": {
"text": [
"okk"
]
}
}
],
"fulfillmentText": "okk",
"intent": {
"displayName": "bookFlight",
"name": "projects/flightquery-82f02/agent/intents/c032518b-f882-4f7f-a49b-fcf57155eeaf"
},
"intentDetectionConfidence": 1.0,
"languageCode": "ru",
"parameters": {
"from": "???????",
"time": "2019-04-12T05:00:00+05:30",
"to": "???-????"
},
"queryText": "?? ??????? ? ???-???? 5 ????"
},
"responseId": "ec09cc39-6c41-44f9-819a-dd7564ef4f92",
"session": "projects/flightquery-82f02/agent/sessions/559a2540-07d1-fc35-4002-04d179f0b55f"
}
实际查询文本为:“из Лондона в Нью-Йорк 5 утра” 收到的queryText是:“?? ????????? ???-???? 5 ????”
【问题讨论】:
-
将 JSON_AS_ASCII 设置为 False 有帮助吗? app.config['JSON_AS_ASCII'] = False
-
嘿,谢谢你的重播。我已经尝试了你的建议,但仍然得到??????用俄语写成的“из Лондона”的状态。确保当我使用英语时,它会给我正确的文本,但使用 unicode。但我对非英语语言的问题,如俄语,所以请指导我为什么我会得到??????插入俄语文本。谢谢
-
编码怎么样? request.json['queryResult']['queryText'].encode('utf-8')
标签: python python-3.x flask unicode dialogflow-es