【问题标题】:Flask make_server always raises "OSError: [Errno 98] Address already in use"Flask make_server 总是引发“OSError:[Errno 98] 地址已在使用中”
【发布时间】:2022-01-18 20:48:28
【问题描述】:

我正在尝试为我正在处理的一些 Python 代码编写单元测试,其中一些代码在完成后会联系 API。我正在尝试运行一个简单的 Flask API 来模拟这个 API 并检查代码是否发送了正确的信息。代码如下:

import unittest
import time
from threading import Thread
from flask import Flask
from flask_restx import Api, Resource
from werkzeug.serving import make_server

mock_app = Flask(__name__)
mock_api = Api(mock_app)


# Mock API
data_in = []
data_out = ""
result_code = 200

@mock_api.route('/jobs')
class MockAPI(Resource):
    def post(self):
        global data_in, data_out, result_code
        data_in.append(mock_api.payload)
        return data_out, result_code


# Unit test class
class TestClass(unittest.TestCase):
    
    def __init__(self, arg):
        super().__init__(arg)
        # Some needed fields
        # ...

        # Mock API Server
        self.mock_server = make_server('localhost', 6000, mock_wfm)
        self.mock_server_thread = Thread(target = self.mock_wfm.serve_forever)

调用make_server 的行是导致异常的行。 lsof -i :6000 之类的命令不会返回任何内容,更改地址或端口也不会解决任何问题。

编辑:

在故障行前添加一个简单的打印后,我发现代码实际上被调用了两次,导致错误。我还不知道为什么。

【问题讨论】:

  • 这是因为你使用的 api 和服务器地址相同
  • 您能详细说明一下吗?我不确定我是否理解您的评论...
  • 您在 localhost 上托管 API 和服务器
  • 您需要将 API 托管在其他主机上,例如另一台计算机或免费托管服务,例如 pythonanywhere.com
  • 在不同的主机上不需要,但在不同的端口上。您使用的是同一个端口,6000。

标签: python flask flask-restx


【解决方案1】:

问题在于 __init__ 方法显然在每次测试中都被调用,所以每次都在第二次失败。

解决办法是把server和Thread的创建放在setUp方法中,在tearDown中关闭。

    def setUp(self):
        self.mock_server = make_server('localhost', 6000, mock_wfm)
        self.mock_server_thread = Thread(target = self.mock_server.serve_forever)
        self.mock_server_thread.start()
        time.sleep(1)

    def tearDown(self):
        self.mock_server.shutdown()
        self.mock_server_thread.join()

【讨论】:

    猜你喜欢
    • 2021-05-14
    • 2020-05-18
    • 1970-01-01
    • 2022-06-26
    • 1970-01-01
    • 2020-10-13
    • 2021-05-10
    • 1970-01-01
    • 2011-05-26
    相关资源
    最近更新 更多