当前位置: 代码网 > it编程>前端脚本>Python > Python使用kombu连接信息中包含#号问题排查方式

Python使用kombu连接信息中包含#号问题排查方式

2024年12月25日 Python 我要评论
python 项目部署生产环境遇到一个错误问题:raise valueerror(f"port could not be cast to integer value as {port!r}&

python 项目部署生产环境遇到一个错误问题:

raise valueerror(f"port could not be cast to integer value as {port!r}") valueerror: port could not be cast to integer value as 'guest

测试环境和本地调试都没有问题,但是到生产之后就有问题,本章复现有问题的mq连接配置的导致的错误信息,记录问题排查过程

版本信息

框架版本
python3.11.7
kombu5.3.4

环境搭建

python 虚拟环境

python 虚拟环境(virtual environment)是一个隔离的 python 解释器环境,它允许你为每个 python 项目安装其特定的依赖包,而不会干扰到全局 python 环境或其他项目。

这样,你可以确保每个项目都有其独立的、一致的依赖环境,避免了版本冲突和依赖混乱的问题。

python 中有几个流行的工具用于创建和管理虚拟环境,其中最常用的是 venv 和 virtualenv

venv 创建 python 虚拟环境

python -m venv .venv

执行该命令之后,会创建一个虚拟的环境,产生 .venv文件夹, 目录结构如下

激活虚拟环境

.venv\scripts\activate

激活虚拟环境之后,文件夹前面会有括号显示虚拟环境的名称

退出虚拟环境

deactivate

虚拟环境下查看python、pip版本

查询pip 配置信息

(.venv) f:\python\mq>pip config list
global.index-url='http://mirrors.aliyun.com/pypi/simple/'
install.trusted-host='mirrors.aliyun.com'

安装依赖

编写 requirements.txt

kombu==5.3.4

在虚拟环境里面安装依赖

pip install -r requirements.txt

问题复现以及问题排查

1.消息发布端 hello_publisher.py

from __future__ import annotations

import datetime

from kombu import connection

with connection('amqp://guest:guest#2024@localhost:5672//') as conn:
    simple_queue = conn.simplequeue('simple_queue')
    message = f'helloworld, sent at {datetime.datetime.today()}'
    simple_queue.put(message)
    print(f'sent: {message}')
    simple_queue.close()

2.在虚拟环境运行代码

出现如下报错信息

(.venv) f:\python\mq>python hello_publisher.py
traceback (most recent call last):
  file "f:\python\mq\hello_publisher.py", line 7, in <module>
    with connection('amqp://guest:guest#2024@localhost:5672//') as conn:
         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  file "f:\python\mq\.venv\lib\site-packages\kombu\connection.py", line 203, in __init__
    url_params = parse_url(hostname)
                 ^^^^^^^^^^^^^^^^^^^
  file "f:\python\mq\.venv\lib\site-packages\kombu\utils\url.py", line 38, in parse_url
    scheme, host, port, user, password, path, query = _parse_url(url)
                                                      ^^^^^^^^^^^^^^^
  file "f:\python\mq\.venv\lib\site-packages\kombu\utils\url.py", line 70, in url_to_parts
    parts.port,
    ^^^^^^^^^^
  file "e:\anaconda\lib\urllib\parse.py", line 182, in port
    raise valueerror(f"port could not be cast to integer value as {port!r}")
valueerror: port could not be cast to integer value as 'guest'

看到报错的堆栈信息,首先定位到代码行

file "f:\python\mq\.venv\lib\site-packages\kombu\utils\url.py", line 70 

在此处加一个断点,调试一下(生产服务不能调试就print输出一下信息)

3.调试出问题的代码

报错的代码方法如下

def url_to_parts(url):
    # type: (str) -> urlparts
    """parse url into :class:`urlparts` tuple of components."""
    scheme = urlparse(url).scheme
    schemeless = url[len(scheme) + 3:]
    # parse with http url semantics
    parts = urlparse('http://' + schemeless)
    path = parts.path or ''
    path = path[1:] if path and path[0] == '/' else path
    return urlparts(
        scheme,
        unquote(parts.hostname or '') or none,
        parts.port,
        unquote(parts.username or '') or none,
        unquote(parts.password or '') or none,
        unquote(path or '') or none,
        dict(parse_qsl(parts.query)),
    )

parts.port 获取的值从 urlparse 方法中解析出来的

执行完 urlparse 方法之后获取到的数值如下

port 的解析在 urlparse 这一步出了问题,重点来看看这个方法的逻辑

经过调试发现问题出在切割方法里面 urllib.parse.urlsplit,具体处理出问题代码在如下片段

链接中有 # 号导致切割之后端口号错位未获取到

去除链接中的#号的正常解析的数据如下

链接中没有 # 号之后,端口可以正常解析了

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持代码网。

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com