Python使用kombu連接信息中包含#號問題排查方式
python 項目部署生產環(huán)境遇到一個錯誤問題:
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
測試環(huán)境和本地調試都沒有問題,但是到生產之后就有問題,本章復現(xiàn)有問題的mq連接配置的導致的錯誤信息,記錄問題排查過程
版本信息
框架 | 版本 |
---|---|
python | 3.11.7 |
kombu | 5.3.4 |
環(huán)境搭建
python 虛擬環(huán)境
Python 虛擬環(huán)境(Virtual Environment)是一個隔離的 Python 解釋器環(huán)境,它允許你為每個 Python 項目安裝其特定的依賴包,而不會干擾到全局 Python 環(huán)境或其他項目。
這樣,你可以確保每個項目都有其獨立的、一致的依賴環(huán)境,避免了版本沖突和依賴混亂的問題。
Python 中有幾個流行的工具用于創(chuàng)建和管理虛擬環(huán)境,其中最常用的是 venv 和 virtualenv
venv 創(chuàng)建 python 虛擬環(huán)境
python -m venv .venv
執(zhí)行該命令之后,會創(chuàng)建一個虛擬的環(huán)境,產生 .venv文件夾, 目錄結構如下
激活虛擬環(huán)境
.venv\Scripts\activate
激活虛擬環(huán)境之后,文件夾前面會有括號顯示虛擬環(huán)境的名稱
退出虛擬環(huán)境
deactivate
虛擬環(huán)境下查看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
在虛擬環(huán)境里面安裝依賴
pip install -r requirements.txt
問題復現(xiàn)以及問題排查
1.消息發(fā)布端 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.在虛擬環(huán)境運行代碼
出現(xiàn)如下報錯信息
(.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 方法中解析出來的
執(zhí)行完 urlparse 方法之后獲取到的數(shù)值如下
port 的解析在 urlparse 這一步出了問題,重點來看看這個方法的邏輯
經過調試發(fā)現(xiàn)問題出在切割方法里面 urllib.parse.urlsplit
,具體處理出問題代碼在如下片段
鏈接中有 # 號導致切割之后端口號錯位未獲取到
去除鏈接中的#號的正常解析的數(shù)據(jù)如下
鏈接中沒有 # 號之后,端口可以正常解析了
總結
以上為個人經驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關文章
Python根據(jù)輸入?yún)?shù)計算結果的實例方法
在本篇文章里小編個大家整理了一篇關于Python根據(jù)輸入?yún)?shù)計算結果的實例方法,有興趣的朋友們可以跟著學習參考下。2021-08-08對python中的iter()函數(shù)與next()函數(shù)詳解
今天小編就為大家分享一篇對python中的iter()函數(shù)與next()函數(shù)詳解,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-10-10python連接手機自動搜集螞蟻森林能量的實現(xiàn)代碼
這篇文章主要介紹了python連接手機自動搜集螞蟻森林能量的實現(xiàn)方法,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2021-02-02