如何使用第三方 http 库测试 python/flask 应用程序?
How to test python/flask app with third-party http lib?
我的 Flask 应用程序有一个最纯粹的套件,效果很好。但是,我想测试一些使用第三方库 (Qt) 发送 http 请求的代码。这怎么可能?我看到 flask-testing
有 live_server
fixture 和 flask.url_for()
一起完成这个,但是在 fixture 中启动服务器需要太多时间。
是否有更快的方法将来自第三方 http 库的 http 请求发送到 flask 应用程序?
谢谢!
事实证明,您可以通过手动将第三方请求转换为 FlaskClient
请求来完成此操作,对第三方库使用的任何 "send" 方法使用 monkeypatch
,然后将 flask.Response
响应转换回第三方回复对象。所有这一切都在不使用 TCP 端口的情况下发生。
这是我为将 Qt http 请求桥接到烧瓶应用程序而编写的固定装置:
@pytest.fixture
def qnam(qApp, client, monkeypatch):
def sendCustomRequest(request, verb, data):
# Qt -> Flask
headers = []
for name in request.rawHeaderList():
key = bytes(name).decode('utf-8')
value = bytes(request.rawHeader(name)).decode('utf-8')
headers.append((key, value))
query_string = None
if request.url().hasQuery():
query_string = request.url().query()
# method = request.attribute(QNetworkRequest.CustomVerbAttribute).decode('utf-8')
# send
response = FlaskClient.open(client,
request.url().path(),
method=verb.decode('utf-8'),
headers=headers,
data=data)
# Flask -> Qt
class NetworkReply(QNetworkReply):
def abort(self):
pass
reply = NetworkReply()
reply.setAttribute(QNetworkRequest.HttpStatusCodeAttribute, response.status_code)
for key, value in response.headers:
reply.setRawHeader(key.encode('utf-8'), value.encode('utf-8'))
reply.open(QIODevice.ReadWrite)
reply.write(response.data)
QTimer.singleShot(10, reply.finished.emit) # after return
return reply
qnam = QNetworkAccessManager.instance() # or wherever you get your instance
monkeypatch.setattr(qnam, 'sendCustomRequest', sendCustomRequest)
return ret
我的 Flask 应用程序有一个最纯粹的套件,效果很好。但是,我想测试一些使用第三方库 (Qt) 发送 http 请求的代码。这怎么可能?我看到 flask-testing
有 live_server
fixture 和 flask.url_for()
一起完成这个,但是在 fixture 中启动服务器需要太多时间。
是否有更快的方法将来自第三方 http 库的 http 请求发送到 flask 应用程序?
谢谢!
事实证明,您可以通过手动将第三方请求转换为 FlaskClient
请求来完成此操作,对第三方库使用的任何 "send" 方法使用 monkeypatch
,然后将 flask.Response
响应转换回第三方回复对象。所有这一切都在不使用 TCP 端口的情况下发生。
这是我为将 Qt http 请求桥接到烧瓶应用程序而编写的固定装置:
@pytest.fixture
def qnam(qApp, client, monkeypatch):
def sendCustomRequest(request, verb, data):
# Qt -> Flask
headers = []
for name in request.rawHeaderList():
key = bytes(name).decode('utf-8')
value = bytes(request.rawHeader(name)).decode('utf-8')
headers.append((key, value))
query_string = None
if request.url().hasQuery():
query_string = request.url().query()
# method = request.attribute(QNetworkRequest.CustomVerbAttribute).decode('utf-8')
# send
response = FlaskClient.open(client,
request.url().path(),
method=verb.decode('utf-8'),
headers=headers,
data=data)
# Flask -> Qt
class NetworkReply(QNetworkReply):
def abort(self):
pass
reply = NetworkReply()
reply.setAttribute(QNetworkRequest.HttpStatusCodeAttribute, response.status_code)
for key, value in response.headers:
reply.setRawHeader(key.encode('utf-8'), value.encode('utf-8'))
reply.open(QIODevice.ReadWrite)
reply.write(response.data)
QTimer.singleShot(10, reply.finished.emit) # after return
return reply
qnam = QNetworkAccessManager.instance() # or wherever you get your instance
monkeypatch.setattr(qnam, 'sendCustomRequest', sendCustomRequest)
return ret