首页 > 编程问答 >Flask 无法获取中文参数

Flask 无法获取中文参数

时间:2024-07-22 08:57:10浏览次数:15  
标签:python flask

我已经在 docker 中从 nvidia/cuda:12.5.1-cudnn-runtime-ubuntu22.04 构建了一个 Flask 应用程序。但是这个flask无法接收任何 utf-8 请求,并出现 Bad request syntax 错误。

# here the messy code ä½\xa0好 is 你好 in Chinese, which means hello
code 400, message Bad request syntax ('GET /chat?question=ä½\xa0好 HTTP/1.1')

对于查询的英文字符 question=hello ,一切正常。我尝试设置 app.json.ensure_ascii = False 并在curl中设置 charset=UTF-8 ,但得到了同样的错误。

但是,当我使用 gunicorn 启动应用程序时,它可以工作。顺便说一句,我将docker镜像的语言环境设置为中文,所以可能不是系统问题。

这是 test.py 的演示代码:

from flask import Flask, request
from loguru import logger
app = Flask(__name__)
app.json.ensure_ascii = False
@app.route("/chat", methods=["GET"])
def chat():
    query = request.args.get("question")
    logger.info(f"用户提问: {query}", enqueue=True)
    print(query)
    return query

@app.route("/")
def test():
    return "你好"

if __name__ == "__main__":
    app.run(host="0.0.0.0", port=10132, debug=True)

我用 python test.py 运行这个演示片段。 curl 的请求很简单 curl --request GET 'http://172.18.0.3:10132/chat?question=你好 然后我收到此错误:

<!DOCTYPE HTML>
<html lang="en">
    <head>
        <meta charset="utf-8">
        <title>Error response</title>
    </head>
    <body>
        <h1>Error response</h1>
        <p>Error code: 400</p>
        <p>Message: Bad request syntax ('GET /chat?question=ä½\xa0好 HTTP/1.1').</p>
        <p>Error code explanation: 400 - Bad request syntax or unsupported method.</p>
    </body>
</html>

其他可能有用的信息:

# OS Which is followed the container nvidia/cuda:12.5.1-cudnn-runtime-ubuntu22.04
PRETTY_NAME="Ubuntu 22.04.4 LTS"
NAME="Ubuntu"
VERSION_ID="22.04"
VERSION="22.04.4 LTS (Jammy Jellyfish)"
VERSION_CODENAME=jammy
ID=ubuntu
ID_LIKE=debian
HOME_URL="https://www.ubuntu.com/"
SUPPORT_URL="https://help.ubuntu.com/"
BUG_REPORT_URL="https://bugs.launchpad.net/ubuntu/"
PRIVACY_POLICY_URL="https://www.ubuntu.com/legal/terms-and-policies/privacy-policy"
UBUNTU_CODENAME=jammy

# Flask version, it is installed through conda
flask                     3.0.3              pyhd8ed1ab_0    conda-forge

# Python version
python                    3.11.9          hb806964_0_cpython    conda-forge

问题在于的终端和 Flask 应用程序之间传递 URL 编码的中文参数时出现了问题。

解决方法:

  1. URL 编码: 确保的中文参数在发送到 Flask 应用程序之前已正确进行 URL 编码。可以使用 Python 的 urllib.parse.quote 函数对中文进行编码。
import urllib.parse

chinese_text = "你好"
encoded_text = urllib.parse.quote(chinese_text)
print(encoded_text)  # 输出:%E4%BD%A0%E5%A5%BD
  1. URL 解码: 在 Flask 应用程序中,使用 urllib.parse.unquote 函数对接收到的编码参数进行解码。
from flask import Flask, request
import urllib.parse

app = Flask(__name__)

@app.route("/chat", methods=["GET"])
def chat():
    query = request.args.get("question")
    decoded_query = urllib.parse.unquote(query)
    # ... 
    return decoded_query

# ...

修改后的 curl 命令:

curl  --request GET 'http://172.18.0.3:10132/chat?question=%E4%BD%A0%E5%A5%BD'

完整示例:

test.py

from flask import Flask, request
import urllib.parse

app = Flask(__name__)
app.json.ensure_ascii = False

@app.route("/chat", methods=["GET"])
def chat():
    query = request.args.get("question")
    decoded_query = urllib.parse.unquote(query)
    print(f"用户提问: {decoded_query}")
    return decoded_query

@app.route("/")
def test():
    return "你好"

if __name__ == "__main__":
    app.run(host="0.0.0.0", port=10132, debug=True)

运行并测试:

  1. 运行 python test.py 启动 Flask 应用程序。
  2. 在终端中执行以下命令:
curl  --request GET 'http://172.18.0.3:10132/chat?question=%E4%BD%A0%E5%A5%BD'

应该会在终端中看到 "用户提问: 你好" 的输出,并且 Flask 应用程序将返回 "你好"。

注意:

  • 确保的终端和 Flask 应用程序使用相同的字符编码 (UTF-8)。
  • 使用 urllib.parse 模块进行 URL 编码和解码可以确保跨平台兼容性。

标签:python,flask
From: 78768527

相关文章

  • Python - for循环不使用正则表达式附加数组
    以下代码从URL获取版本号,然后对于每个版本号,转到该版本号的页面并使用文件名的特定模式填充数组。生成的数组应包含每个版本号的文件名列表,但它似乎只包含早期版本(2.6)。使用print语句,我可以看到代码的工作原理是它获取sha256sums.asc文件-所有这些文件,所有版本。我猜......
  • 使用 callable_iterator (re.finditer) 导致 Python 冻结
    我有一个为文本的每一行调用的函数。deftokenize_line(line:str,cmd=''):matches=re.finditer(Patterns.SUPPORTED_TOKENS,line)tokens_found,not_found,start_idx=[],[],0print(matches)formatchinmatches:pass#Rest......
  • Python 的 time.sleep - 永远不会醒来
    我认为这将是那些简单的问题之一,但它让我感到困惑。[停止媒体:我是对的。找到了解决方案。查看答案。]我正在使用Python的单元测试框架来测试多线程应用程序。很好而且很直接-我有5个左右的工作线程监视一个公共队列,以及一个为它们制作工作项的生产者线程......
  • python中使用mitmproxy的http模块出错
    我有一个使用mitmproxyhttp函数的代码,它在这里惨败:defmain(stdscr):try:parser=argparse.ArgumentParser(description='NetSourNetworkAnalyzer')parser.add_argument('--proxy',action='store_true',help='EnableH......
  • 使用python图像去噪没有获得所需的重建图像
    我是python机器学习的初学者,我正在编写一个程序,使图像变得嘈杂,然后我的程序输出重建的图像。我正在使用加性高斯白噪声并使用前馈神经网络。我的程序显示真实图像、噪声图像和重建图像。这些是我通常得到的结果。有人知道如何解决这样的问题吗?这是我的代码:ap......
  • 使用 pip 22.3.1 和 python 3.11.0 安装 MetaTrader5 错误
    我正在尝试使用pip在Windows上安装MetaTrader5。python--versionPython3.11.0pip--versionpip22.3.1pipinstallMetaTrader5ERROR:CouldnotfindaversionthatsatisfiestherequirementMetaTrader5(fromversions:none)ERROR:Nomatchingdistribu......
  • 在 Python 中溶解线条
    我有一个包含多行的形状文件。我正在寻找一种方法来消除所有的接触线。这在ArcMap中是可能的,但似乎在Python和QGIS中都无法做到:之前:所需的输出:这需要在多行上完成,因此像QGIS合并一样手动执行不是一个选项。在ArcMap中,我曾经使用“溶解”......
  • 一个简单的问题(python、串行通信和arduinos)
    只是一个关于小脚本的快速问题,由于某种原因无法工作我运行了这个脚本:importserialimporttimeimportturtledefserialreading():serialPort=serial.Serial(port="COM5",baudrate=9600,bytesize=8,timeout=2,stopbits=serial.STOPBITS_ONE......
  • 我在 Windows 10 上运行 Python 代码后控制台立​​即关闭
    虽然我在代码末尾使用input(),但在Windows10(IDLE之外)的窗口中输入名称后,控制台仍然立即关闭,并且我看不到结果。我该怎么做才能阻止控制台关闭?#!python3name=input('Enteryourname:')print('Hello'+name)input('pressEntertoexit:')你在代码末尾......
  • 具有未定义嵌套列表深度的嵌套列表的Python注释类型
    [[1,2,3],3,[2,4],5]的类型是list[list[int]|int]但是,如果嵌套列表具有未定义的深度,例如[[[1,2]],2,[1,[3,[3]]]],3,[2,[2]]],那么它会具有什么类型?可以使用递归类型提示来表示任意深度嵌套的列表:fromtypingimportList,Union......