You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Flask无法路由含非ASCII字符的URL问题求助

解决Flask路由中#符号与俄语词汇传递问题

嘿,我来帮你搞定这个Flask里的URL路由小坑!你遇到的两个核心问题其实是浏览器URL规则和字符编码的常见问题,咱们一步步拆解解决:

为什么#符号传不过去?

浏览器会把URL里的#当作页面内锚点标识符——它只会在客户端(浏览器)本地处理,不会把#及其后面的内容发送给服务器。所以你直接在地址栏输入/hashtags/#привет,服务器实际收到的只有/hashtags/,后面的内容全丢了。

解决方案分两步:处理#符号 + 兼容俄语词汇

1. 处理#符号的两种实用办法

办法一:对#进行URL编码

让请求方把#转换成标准URL编码%23,俄语词汇也会被自动编码成UTF-8格式(比如привет会变成%D0%BF%D1%80%D0%B8%D0%B2%D0%B5%D1%82)。

修改你的路由,使用path转换器(它能匹配除?外的所有字符,包括编码后的特殊字符),再解码还原原始内容:

# -*- coding: utf-8 -*-
from flask import Flask, jsonify
from urllib.parse import unquote

app = Flask(__name__)

@app.route('/hashtags/<path:names>', methods=['GET'])
def get_hashtags(names):
    # 解码URL编码的字符串,还原#和俄语词汇
    decoded_hashtag = unquote(names)
    return jsonify({"received_hashtag": decoded_hashtag})

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

现在访问/hashtags/%23%D0%BF%D1%80%D0%B8%D0%B2%D0%B5%D1%82,服务器就能正确返回#привет啦。

办法二:改用查询参数(更友好)

如果不想让用户手动编码,可以把参数放到查询字符串里,比如用/hashtags?name=#привет。不过要注意:直接在地址栏输入的话,浏览器还是会把#后面的内容当作锚点,所以最好让前端用encodeURIComponent()编码参数后再发送,或者测试时直接用编码后的%23。

对应的代码:

# -*- coding: utf-8 -*-
from flask import Flask, jsonify, request
from urllib.parse import unquote

app = Flask(__name__)

@app.route('/hashtags', methods=['GET'])
def get_hashtags():
    hashtag = request.args.get('name')
    if not hashtag:
        return jsonify({"error": "请提供name参数"}), 400
    # 解码还原原始内容
    decoded_hashtag = unquote(hashtag)
    return jsonify({"received_hashtag": decoded_hashtag})

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

测试时访问/hashtags?name=%23%D0%BF%D1%80%D0%B8%D0%B2%D0%B5%D1%82,就能拿到正确的#привет。

2. 确保俄语词汇正常传递

你已经在代码开头声明了# -*- coding: utf-8 -*-,这很好,保证了代码文件本身的编码正确。另外:

  • Flask默认支持UTF-8编码的URL参数,只要参数被正确编码(浏览器通常会自动处理非ASCII字符的编码),服务器就能正确接收。
  • 使用unquote()解码时,它会自动处理UTF-8编码的俄语字符,还原成原始的俄语词汇。

额外提示

如果是前端发送请求,记得用encodeURIComponent()对整个哈希标签进行编码,比如:

const hashtag = "#привет";
const encodedHashtag = encodeURIComponent(hashtag);
// 发送请求到 `/hashtags/${encodedHashtag}` 或者 `/hashtags?name=${encodedHashtag}`

内容的提问来源于stack exchange,提问作者ksusha

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 04:08:51