1、requests

        在 Flask 框架项目中,可以通过使用 requests 模块来进行内部接口调用。requests 模块是 Python 中常用的 HTTP 请求库,可以用于发送 HTTP 请求和处理响应。

示例代码:

from flask import Flask

import requests

app = Flask(__name__)

@app.route('/api1')

def api1():

# 调用内部接口api2

response = requests.get('http://localhost:5000/api2') # 指定接口的URL

if response.status_code == 200:

return "API1:" + response.text

else:

return "API1: Failed to call API2!"

@app.route('/api2')

def api2():

return "API2: Hello from API2"

if __name__ == '__main__':

app.run(debug=True)

        在上面的示例中,api1 和 api2 分别是两个内部接口。api1 中调用了 api2,并通过 requests.get() 方法发送 GET 请求到 http://localhost:5000/api2,并处理响应。可以根据实际情况设置接口的 URL 和请求参数、请求头等。

        需要注意的是,在内部接口调用时,可以直接使用 Flask 的 app.route 装饰器定义的路由地址作为 URL,而不需要通过外部网络进行实际的 HTTP 请求。同时,需要注意处理异常、错误状态码等情况,以保证内部接口调用的稳定性和可靠性。

运行结果:

2、url_for

        如果在 Flask 项目中需要通过内部接口调用其他内部接口,但是目标接口的 URL 未知,可以使用 Flask 中的 url_for 函数来生成目标接口的 URL。

        url_for 函数可以根据 Flask 中定义的路由函数名生成对应的 URL。这样可以避免直接硬编码 URL,使得代码更加灵活和可维护。

示例代码:

from flask import Flask, url_for

app = Flask(__name__)

@app.route('/api1')

def api1():

# 调用内部接口api2

api2_url = url_for('api2') # 通过路由函数名生成api2的URL

return "API1:" + api2_url

@app.route('/api2')

def api2():

return "API2: Hello from API2"

if __name__ == '__main__':

app.run(debug=True)

        在上面的示例中,api1 和 api2 分别是两个内部接口。在 api1 中调用了 api2,通过 url_for 函数生成了 api2 的 URL,而不需要硬编码具体的 URL。这样,当 api2 的路由地址发生变化时,只需要修改对应的路由函数名,而不需要修改实际的 URL。

        需要注意的是,url_for 函数的参数是路由函数的名字(即装饰器中定义的路由地址函数名),而不是具体的 URL 地址。可以使用 url_for 函数的第一个参数来传递路由函数名,其余参数可以用来传递 URL 中的变量值、查询参数等信息,具体用法可以参考 Flask 官方文档。

运行结果:

3、直接调用python函数

        如果目标接口是一个 Python 函数,而不是通过路由定义的 Flask 接口,可以直接在项目内部调用该 Python 函数。例如,如果目标接口是一个单独的函数定义,可以直接导入该函数所在的模块,并调用该函数。这种方式可以在不涉及路由的情况下实现内部接口调用,但需要注意参数的传递和返回值的处理。

 示例代码:

from flask import Flask

app = Flask(__name__)

@app.route('/api1')

def api1():

# 调用内部接口api2

api2_func = api2()

return "API1:" + api2_func

@app.route('/api2')

def api2():

return "API2: Hello from API2"

if __name__ == '__main__':

app.run(debug=True)

在 api1.py 中,可以直接导入 api2_func 并调用,而不需要通过路由进行调用。

运行结果:

4、test_client

        使用 Flask 的 test_client 进行模拟请求:Flask 提供了一个 test_client 对象,可以用于模拟 HTTP 请求,并调用 Flask 应用中的路由进行测试。这样可以实现在项目内部调用其他路由的效果,而无需启动实际的 HTTP 服务器。

示例代码:

from flask import Flask

app = Flask(__name__)

@app.route('/api1')

def api1():

# 调用内部接口api2

result = app.test_client().get('/api2')

print(result) #

print(result.data) # b'API2: Hello from API2'

return "API1:" + result.data.decode('utf-8')

@app.route('/api2')

def api2():

return "API2: Hello from API2"

if __name__ == '__main__':

app.run(debug=True)

        在上面的示例中,api1 中通过 app.test_client().get('/api2') 调用了 api2 路由,获取到其返回的响应,并解析其中的数据。这样可以在项目内部模拟调用其他路由,进行内部接口调用的测试和实现。需要注意的是,使用 test_client 进行内部接口调用时,不会涉及实际的 HTTP 请求和响应,只是在应用内部进行模拟调用。

运行结果: 

5、url_for+test_client

示例代码:

from flask import Flask, url_for

app = Flask(__name__)

@app.route('/api1')

def api1():

# 调用内部接口api2

result = app.test_client().get(url_for('api2'))

print(result) #

print(result.data) # b'API2: Hello from API2'

return "API1:" + result.data.decode('utf-8')

@app.route('/api2')

def api2():

return "API2: Hello from API2"

if __name__ == '__main__':

app.run(debug=True)

6、test_request_context

示例代码:

from flask import Flask

app = Flask(__name__)

@app.route('/api1')

def api1():

# 调用内部接口api2

with app.test_request_context('./api2', method='GET'):

result = api2()

return "API1:" + result

@app.route('/api2')

def api2():

return "API2: Hello from API2"

if __name__ == '__main__':

app.run(debug=True)

        在上面的示例中,通过 app.test_request_context() 创建了一个新的请求上下文,设置了目标接口的 URL 为 /api2,请求方法为 GET,然后调用了 api2() 函数进行内部接口调用。

运行结果:

7、多种方法效率比较

        在 Flask 框架中,内部接口调用的效率通常取决于多个因素,包括网络延迟、服务器性能、请求的处理复杂度等。因此,很难一概而论哪种方法效率最好,最佳方法可能因具体情况而异。

        一般而言,直接调用其他接口的方法(如使用 requests 库)可能会引入网络延迟,因为请求需要通过网络发送到其他接口并等待响应返回。而使用 Flask 的 test_client 进行内部请求则是在应用内部进行模拟请求,没有经过网络,因此可能会更快一些。

        另外,如果内部接口的处理逻辑相对简单,且在同一 Flask 应用中,直接调用其他接口的方法可能更加简便。而如果内部接口的处理逻辑复杂,或者需要调用其他 Flask 应用中的接口,使用 test_client 可能更加方便。

        需要根据具体的应用场景和需求来选择最合适的方法。在实际开发中,可以进行性能测试和基准测试,评估不同方法的性能,并选择最合适的方法。

7.1 flask框架中app.test_client()和app.test_request_context()方法的区别

        在Flask框架中,app.test_client()和app.test_request_context()方法都是用于测试的辅助方法,但它们的作用和使用方式有所不同。

1、app.test_client()

app.test_client()方法返回一个测试客户端对象,用于模拟发送HTTP请求到Flask应用程序。可以使用测试客户端对象发送请求,模拟与应用程序的交互。通过调用测试客户端对象的方法(例如get()、post()等),可以发送GET、POST等请求,并获取响应结果进行断言和测试。适用于对应用程序进行集成测试、端到端测试等。

2、app.test_request_context()

app.test_request_context()方法返回一个请求上下文对象,用于模拟一个请求上下文环境。可以使用请求上下文对象来手动创建请求对象、推入请求上下文栈,并在其中执行代码。可以使用请求上下文对象的request属性来访问模拟的请求对象,进行测试和断言。适用于对特定视图函数、路由或蓝图进行单元测试。

总的来说,app.test_client()适用于模拟发送HTTP请求到应用程序进行集成测试,而app.test_request_context()适用于手动创建请求上下文环境,对特定视图函数或路由进行更精细的单元测试。

参考文章

评论可见,请评论后查看内容,谢谢!!!
 您阅读本篇文章共花了: