当前位置:首页>python>3python之testing模块模拟请求及流式处理

3python之testing模块模拟请求及流式处理

  • 2026-09-09 11:35:06
3python之testing模块模拟请求及流式处理

写在前面的话

孩子都这样吗。昨天下午将近3点时,大宝给我打电话,说是弟弟把他的植物大战僵尸杂交版重置了,那是花了一个春节假期打出来的成就,哭的很伤心,大宝坚持让我回来找,久劝不下,我就回来了,正好抖哥没来图书馆。回来后,看了下账户重置了,里面的挑战模式里的东西,基本都还在,安抚了一下,才高兴起来。我在想,现在孩子都这么脆弱吗,暑假就上三年级了,还是个男孩,动不动就哭,并且是流眼泪的那种,不是假哭。过年和亲戚打电话,他们也提到自己孩子挑食,不吃饭,爱吃零食和外卖,这一点和我家大宝一样,老妈说,这离那么远,孩子之间通气了吗,表决一致,统一挑食。以前,家里包顿饺子或者家里来客,上集调几个菜,孩子眼馋的不行。现在大宝看都不看,吃了就吐。真是想不通啊。

[310]-------底部有张生活照片

【关键词】python、testing模块、debug内置库、流式接收

一、python接口相关(一级)

1.testing模块模拟请求(二级)

描述:现在想在testing模块进行一个模拟请求,现在请求的都是本地接口,怎么请求线上接口。

开工:

第一步:模推get请求(三级)

20250105周日时间段:10:55-11:00
20250105周日时间段:11:25-11:40

写程序如下:

def test_get_conversation2_online():
    url = f"{CR.BASE_URL}/v1/api/conversation/d4cb055cc6b911efa21b0242ac120006"
    log.info(f"\n\n url:{url} \n\n")
    response = requests.get(url)
    print(f"\n\n response--onLine:{response} \n\n")

注:这个跑一下,好像还是本地,邪门了。重启了一下电脑就好了。接下来,测online_completion

第二步:测online_completion(三级)

20250105周日时间段:12:07-12:20

修改代码如下:

图3a-1

注:这个不用client,而是用requests,看下能不能请求到线上代码。发现可以请求成功,并正确返回,截图如下:

图3a-2

注:说明这个测试用例写的没有问题,那同样的代码,测下本地,确认是不是本地哪个地方写错了。

第三步:测local_completion(三级)

20250105周日时间段:12:31-12:40
20250105周日时间段:12:40-13:00

test_local_completion报错:'WrapperTestResponse' object is not iterable,实际上代码中没有写iterable,重启下vscode试试。

重启后,运行,截图如下:

图3a-3

注:我知道了,这有没有可能是代码里报的,不是测试用例中报的。

经确定,确实是测试用例中报的,修改如下:

图3a-4

注:运行下试试。这个不是流式接收,有问题。接下来,用流式接收试试。

第四步:流式接收(三级)

20250105周日时间段:15:37-15:40
20250105周日时间段:15:40-16:00

用流式接收试试,截图如下:

图3a-5

注:这个模拟是流式的,如下:

图3a-6

注:线上这样写是能正常输出的,但本地不行。我突然想到,能不能本地不用测试模块了,也用requests进行模拟请求呢。

第五步:本地requests模拟请求(三级)

20250105周日时间段:16:17-16:20
20250105周日时间段:16:20-16:40

本地模拟requests请求,结果如下:

图3a-7

注:换成本地链接后,发现10分钟没运行结束,好慢,还是哪里出问题了。

先简化下测试用例,如下:

def test_online2_completion():

    messages = [{"role":"user","content":"我家狗感冒了"}]
    url = f"{base_url2}/v1/api/completion"
    log.info(f"\n\n url:{url} \n\n")
    resp = requests.post(
        url,
        json = json.dumps({
            "conversation_id": "6c0ca0f6c3f611ef94e1f020ff63f4c4",
            "messages": messages
        }),
        headers = {
            "Content-type": "application/json",
            "Authorization": "Bearer ragflow-UxOGYzZjUwYjMwOTExZWZiODc0MDI0Mm"
        }
    )

    if not 200 <= resp.status_code < 300:
        raise Exception(f"GET {url} status_code {resp.status_code}.")

    log.info(f"\n\n resp:{resp} \n\n")
    for chunk in resp:
        if chunk:   
            log.info(f"\n\n chunk:{chunk} \n\n")

注:发现本地跑不起来,不知为什么。应该是对接收参数的处理有问题。

找到了错误的地方,如下:

图3a-8

注:跑一下,看看是不是这里。是这里,接下来捕捉一下,报错信息。

第六步:捕捉completion报错信息(三级)

20250106周一时间段:11:27-11:40

捕捉报错信息,修改代码片段如下:

except Exception as e:
                log.debug(f"error {e}")  
                log.error(f"An error occurred: {traceback.format_exc()}")  
                log.error(f"An error occurred2: {repr(e)}")  

注:经测试发现,【log.error(f"An error occurred: {traceback.format_exc()}")  】,这个能捕捉到异常,截图如下:

图3a-9

注:接下来,看下这个异常怎么处理。

第七步:处理异常(三级)

20250106周一时间段:11:35-11:40
20250106周一时间段:11:40-12:00
20250106周一时间段:22:29-22:40

最后,追踪到.venv里了,可能是.venv有问题,在线上发布试试,看看能不能解决这个问题。从而知道是不是本地出问题了。

线上没问题,本地报这个:

 File \"e:\\16python\\12\\ragflow1203\\local_ragflow\\.venv\\Lib\\site-packages\\httpx\\_transports\\default.py\", line 86, in map_httpcore_exceptions\n    raise mapped_exc(message) from exc\nhttpx.ConnectTimeout: [WinError 10060] 由于连接方在一段时间后没有正确答复或连接的主机没有反应,连接尝试失败。\n", "reference": []}} 

注:看下这个错误怎么回事,是ollama没连上。现在要记录一个事,就是如何把debug到内置库里去。

2.debug内置库(二级)

20250106周一时间段:22:32-22:40

描述:现在一个方法出问题了,要debug追踪,怎么追踪到内置库里去呢,这个龙哥已演示了一遍怎么做,要记录一下。

开工:

第一步:改配置(三级)

20250106周一时间段:22:35-22:40

先改下配置,配置文件为:

{
            "type": "debugpy",
            "request": "launch",
            "name": "test_completion",
            "module": "pytest",
            "args": [
                "-s",
                "${workspaceFolder}/test/test_api_app2.py::test_completion"
            ],
            "console": "integratedTerminal",
            "env": {"PYTHONPATH": "${workspaceFolder}"},
            "cwd":"${workspaceFolder}",
            "justMyCode": false 
        }

截图如下:

图3a-10

注:这个里面主要包含一个路径(/test/test_api_app2.py)及里面的方法名(test_completion),接下来,要演示一下怎么使用。

二、python练习(一级)

1.练习一(二级)

描述:Python 函数参数传递

程序如下:

def func(x, y=[]):
    y.append(x)
    return y

result1 = func(10)
result2 = func(20, [])
result3 = func(30)
print(result1, result2, result3)
A. [10, 30] [20] [10, 30]
B. [10] [20] [30]
C. [10, 30] [20] [10, 30]
D. [10] [20] [10]

开工:

第一步:输出

以上程序输出什么,目测是A

第二步:分析

Python 的默认参数(如 y=[])在函数定义时只初始化一次,因此 y=[] 是一个持久的对象。
result1 和 result3 使用了同一个默认的空列表,而 result2 创建了一个新的列表,不受默认参数影响。
result1 = func(10),y 为 [10]。
result3 = func(30),y 为 [10, 30]。

注:这个没太理解,先这样记吧。

三、生活照片

拍摄于‎2026‎年‎1‎月‎1‎日,‏‎13:31:57,带孩子去河北古北水镇玩,当时大宝八岁一个月,二宝三岁三个月。总体感觉现在的孩子很脆弱,之前,我们那一代,父母只关心孩子能否吃饱,是否逃学,不听话棍棒伺候。现在孩子,把大人气的不行,还没打呢,自己哭起来了,还死倔,有次我给大宝说,再这样,我打你了。大宝说,你打死我吧,反正还有我弟。这让我不知怎么接话,慢慢来吧,估计大了就好了。

图3c-1

《本文完》

最新文章

随机文章