最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Python使用kombu連接信息中包含#號問題排查方式

 更新時間:2024年12月24日 09:31:39   作者:Chengdu.S  
文章描述了在部署Python項目到生產(chǎn)環(huán)境時遇到的一個錯誤,即端口號無法正確轉(zhuǎn)換為整數(shù)值,該錯誤在測試環(huán)境和本地調(diào)試中沒有出現(xiàn),但在生產(chǎn)環(huán)境中才出現(xiàn),通過分析錯誤信息和代碼,作者發(fā)現(xiàn)問題出在URL解析過程中,特別是在處理包含特殊字符(如#號)的URL時

python 項目部署生產(chǎn)環(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)境和本地調(diào)試都沒有問題,但是到生產(chǎn)之后就有問題,本章復(fù)現(xiàn)有問題的mq連接配置的導(dǎo)致的錯誤信息,記錄問題排查過程

版本信息

框架版本
python3.11.7
kombu5.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)境,產(chǎn)生 .venv文件夾, 目錄結(jié)構(gòu)如下

激活虛擬環(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

問題復(fù)現(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 

在此處加一個斷點,調(diào)試一下(生產(chǎn)服務(wù)不能調(diào)試就print輸出一下信息)

3.調(diào)試出問題的代碼

報錯的代碼方法如下

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 這一步出了問題,重點來看看這個方法的邏輯

經(jīng)過調(diào)試發(fā)現(xiàn)問題出在切割方法里面 urllib.parse.urlsplit,具體處理出問題代碼在如下片段

鏈接中有 # 號導(dǎo)致切割之后端口號錯位未獲取到

去除鏈接中的#號的正常解析的數(shù)據(jù)如下

鏈接中沒有 # 號之后,端口可以正常解析了

總結(jié)

以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關(guān)文章

最新評論

十堰市| 崇义县| 石台县| 汾西县| 象山县| 香格里拉县| 蛟河市| 高安市| 和硕县| 镇远县| 罗山县| 新丰县| 孟津县| 孝感市| 江孜县| 藁城市| 德钦县| 犍为县| 滁州市| 清新县| 宜宾市| 特克斯县| 曲靖市| 镇赉县| 宜州市| 乌兰县| 施秉县| 北辰区| 黔江区| 合肥市| 迁西县| 扬中市| 家居| 璧山县| 西畴县| 霞浦县| 牡丹江市| 竹山县| 额尔古纳市| 宜兰市| 类乌齐县|