Flask - 如何处理 URL 中的汉字

Flask - How to deal with Chinese character in URL

我正在使用 Flask 构建 REST API,但是当我传递带有中文字符的查询参数时,我得到的是乱码而不是中文

from flask import Blueprint
from flask_restful import Resource, Api

class Keyword(Resource):
    def post(self, keyword):
        return {"keyword": "keyword"}

keyword_api = Blueprint('resourses.keyword', __name__)
api = Api(keyword_api)
api.add_resource(
    Keyword,
    '/keyword/<string:keyword>',
    endpoint='keyword'
)
POST http://localhost:5000/keyword/價錢

我期望输出 {"keyword": "价钱"},但实际输出是 {"keyword": "è²´é\u0081\u008e"}

更新: 现在我把这个添加到代码中,它 returns {"keyword": "价钱"} 正确

keyword = keyword.encode('iso-8859-1').decode('utf8')

代码似乎运行正常。我冒昧地对其进行了一些修改,并将其变成了一个工作示例。需要注意的重要一点是 b'{"keyword": "\u50f9\u9322"}' 对象类型是由 b[=15= 表示的字节] 字首。如果将此数据从 json 序列化为 python 原生字符串,您会发现它是有效的价格编码。

from flask import Blueprint, Flask
from flask_restful import Resource, Api
from werkzeug.local import LocalProxy
from logging import DEBUG

app = Flask(__name__)
app.logger.setLevel(DEBUG)
logger = LocalProxy(lambda: app.logger)


class Keyword(Resource):
   def post(self, keyword):
      logger.info("Keyword: {}".format(type(keyword)))
      return {"keyword": keyword}

keyword_api = Blueprint('resourses.keyword', __name__)
api = Api(keyword_api)
api.add_resource(
    Keyword,
    '/keyword/<string:keyword>',
    endpoint='keyword'
)

app.register_blueprint(keyword_api)

类型为'utf-8',但被'iSO-8859-1'解码,所以出现乱码。 Bytes 数据被 'iso-8859-1' 解码为 Str。当你用'iso-8859-1'编码的时候,它又变回了Bytes的数据,然后用utf-8解码,输出就对了。这是不同 encoding/decoding 类型之间的变化。找到对应的参数就可以设置解码类型为utf-8