flask项目中内部接口调用其他内部接口操作

2023-05-16

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)  # <WrapperTestResponse streamed [200 OK]>
    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)  # <WrapperTestResponse streamed [200 OK]>
    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 可能更加方便。

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

flask项目中内部接口调用其他内部接口操作 的相关文章

随机推荐

  • 爬虫之爬取百度贴吧

    爬虫之爬取百度贴吧 直接示例代码 xff1a import requests from lxml import html etree 61 html etree from lxml import etree class Tieba obje
  • 正则表达式匹配开头和结尾(^、$、[^指定字符])

    1 匹配开头和结尾 代码功能 匹配字符串开头 匹配字符串结尾 示例1 xff1a 需求 xff1a 匹配以数字开头的数据 import re 匹配以数字开头的数据 match obj 61 re match 34 d 34 34 1hell
  • 人工智能主要分支

    人工智能主要分支 1 主要分支介绍 通讯 感知与行动是现代人工智能的三个关键能力 xff0c 在这里我们将根据这些能力 应用对这三个技术领域进行介绍 xff1a 计算机视觉 CV 人脸识别 自然语言处理 NLP 语音识别 语义识别 在 NL
  • re.sub()用法详解

    源代码 参数及其意义 xff1a def sub pattern repl string count 61 0 flags 61 0 34 34 34 Return the string obtained by replacing the
  • BERT模型的详细介绍

    1 BERT 的基本原理是什么 xff1f BERT 来自 Google 的论文Pre training of Deep Bidirectional Transformers for Language Understanding xff0c
  • 自然语言处理(NLP)之使用TF-IDF模型计算文本相似度

    自然语言处理 NLP 之使用TF IDF模型计算文本相似度 所用数据集 xff1a ChnSentiCorp htl all csv 语料库即存放稀疏向量的列表 要注意的是 xff0c 搜索文本text与被检索的文档共用一个特征词词典 NL
  • HTTP 请求报文

    1 HTTP 请求报文介绍 HTTP最常见的请求报文有两种 GET 方式的请求报文POST 方式的请求报文 说明 GET 获取web服务器数据 比如获取新闻列表的数据 POST 向web服务器提交数据 比如登录的时候把用户名和密码发送给服务
  • 傅里叶变换公式

    傅里叶变换的目的 xff1a 有些信号在时域上是很难看出什么特征的 xff0c 但是如果变换到频域之后 xff0c 就很容易看出特征了 1 FS Fourier series 连续时间周期信号的傅里叶级数 xff0c 时域上任意连续的周期信
  • python修改闭包内使用的外部变量

    1 修改闭包内使用的外部变量 1 1 修改闭包内使用的外部变量的错误示例 定义一个外部函数 def func out num1 定义一个内部函数 def func inner num2 这里本意想要修改外部num1的值 xff0c 实际上是
  • re.search()用法详解

    re search xff1a 匹配整个字符串 xff0c 并返回第一个成功的匹配 如果匹配失败 xff0c 则返回None pattern 匹配的规则 string 要匹配的内容 flags 标志位 这个是可选的 就是可以不写 可以写 比
  • re.findall()用法详解

    re findall xff1a 函数返回包含所有匹配项的列表 返回string中所有与pattern相匹配的全部字串 xff0c 返回形式为数组 示例代码1 xff1a 打印所有的匹配项 import re s 61 34 Long li
  • Linux系统中创建虚拟环境详解

    1 方法一 1 1 安装虚拟环境的命令 xff1a sudo pip install virtualenv sudo pip install virtualenvwrapper 1 2 安装完虚拟环境后 xff0c 如果提示找不到mkvir
  • 使用python将图片改为灰度图或黑白图

    使用python将图片改为灰度图或黑白图有三种方式 xff0c 分别是是使用cv2库和PIL库来实现 xff0c 详细过程如下所示 1 使用cv2库将图片改为灰度图 在使用cv2进行读取原彩色图片时 xff0c 在里面添加一个参数cv2 I
  • 虚拟机中windows镜像下载与安装

    镜像文件下载 xff1a 链接 xff1a https pan baidu com s 1VKWMHHCGRwWXk2GpxyUp0A 提取码 xff1a shlg 注意 xff1a 虚拟机中的镜像和本地电脑系统安装的镜像是一样的 安装教程
  • Linux系统中安装elasticsearch详解

    官方网站 xff1a Install Elasticsearch from archive on Linux or MacOS Elasticsearch Guide 7 17 Elastic 一 安装命令 xff1a wget https
  • centos7系统查看防火墙状态

    查看方法 xff1a 1 利用systemctl查看 xff0c 该命令用于管理系统 xff0c 语法为 systemctl status firewalld xff1b 2 用firewall查看 xff0c 可以查看防火墙的默认状态 x
  • Docker中网络的使用和配置用法详解

    一 单个物理机中docker网络 1 1 Docker默认网桥 安装Docker 服务默认会创建一个 docker0 网桥 xff08 其上有一个 docker0 内部接口 xff09 xff0c 它在内核层连通了其他的物理或虚拟网卡 xf
  • mongo数据库中字符串型正负数值比较大小

    数据库中数据展示 xff1a 使用python代码实现 xff1a Requires pymongo 3 6 0 43 from pymongo import MongoClient client 61 MongoClient 34 mon
  • IDEA插件系列(3):Easy Javadoc插件——快速生成javadoc文档注释

    1 插件介绍 Easy Javadoc插件 能帮助开发者快速生成类 方法 属性等中文javadoc 2 安装方式 第一种安装方式是在线下载安装插件 第二种安装方式是使用离线插件进行安装 插件下载地址 xff1a https plugins
  • flask项目中内部接口调用其他内部接口操作

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