如何无需使用requests库,在代码中直接调用Flask的endpoint接口
可行实现方案
方案1:业务逻辑抽离(最推荐)
该方案从架构层面解耦HTTP层和业务逻辑,完全规避了「调用Flask endpoint」的需求,后续维护、扩展成本最低。你可以把路由中的核心逻辑单独封装为独立函数,HTTP接口和TCP监听逻辑共同调用该函数即可:
from flask import Flask import threading data = 'foo' app = Flask(__name__) # 单独抽离核心业务逻辑 def handle_some_command(): return { 'Some' : 'Response'} @app.route("/SomeCommand") def SomeCommand(): # 路由直接调用通用业务函数 return handle_some_command() def flaskThread(): app.run() def TcpListenner(): # TCP逻辑收到对应指令后,直接调用业务函数即可 while True: # 省略TCP socket接收指令的逻辑 cmd = receive_tcp_cmd() if cmd == "SomeCommand": resp = handle_some_command() # 把resp序列化后返回给TCP客户端即可 send_tcp_response(resp) if __name__ == "__main__": flaskApp = threading.Thread(target=flaskThread) flaskApp.start() listenner = threading.Thread(target=TcpListenner) listenner.start()
方案2:使用Flask内置测试客户端直接调用路由
如果你的路由逻辑耦合了大量Flask请求上下文相关操作(比如要读取request参数、session等),不想改动现有代码,可以用Flask自带的test_client在进程内模拟发起请求,不需要走网络,也不需要引入requests库:
def TcpListenner(): # 初始化测试客户端 client = app.test_client() while True: # 省略TCP接收指令逻辑 cmd = receive_tcp_cmd() if cmd == "SomeCommand": # 模拟调用/SomeCommand路由,支持传查询参数、请求体、头等,和真实请求用法一致 resp = client.get("/SomeCommand") # 从响应中取数据:resp.status_code 是状态码,resp.json 是json格式响应体,resp.data 是原始字节 resp_data = resp.json # 返回给TCP客户端 send_tcp_response(resp_data)
注意事项
- 如果调用时遇到Flask上下文相关报错,可以把调用逻辑包在应用上下文管理器中:
with app.app_context(): resp = client.get("/SomeCommand")
test_client支持所有HTTP方法调用,POST/PUT等都可以,传参方式和requests基本一致,比如client.post("/xxx", json={"key":"val"})
内容的提问来源于stack exchange,提问作者HiDDeN
相关产品推荐
相关产品推荐

