python多线程及多进程运行mitmproxy、flask
使用mitmproxy及flask分别实现了2个功能程序(一个做代理抓包运行在8080端口、一个做web程序运行在80端口)想要通过运行一个python程序来同时提供这2种功能,就搜了下python下的多线程和多进程实现。
一、已知mitmproxy下可以托管WSGI应用程序(参考官方案例wsgi-flask-app.py)
#wsgi-flask-app.py from flask import Flask from mitmproxy.addons import asgiapp app = Flask("proxapp") @app.route('/') def hello_world() -> str: return 'Hello World!' addons = [ # Host app at the magic domain "example.com" on port 80. Requests to this # domain and port combination will now be routed to the WSGI app instance. asgiapp.WSGIApp(app, "example.com", 80) #example.com只是示例, 也可以改成任何域名比如ranjuan.cn,只要访问你设置的域名mitmproxy都会转发到flask上! # SSL works too, but the magic domain needs to be resolvable from the mitmproxy machine due to mitmproxy's design. # mitmproxy will connect to said domain and use serve its certificate (unless --no-upstream-cert is set) # but won't send any data. # mitmproxy.ctx.master.apps.add(app, "example.com", 443) ]
上面这个wsgi-flask-app.py案例片段,事实上相当于把flask整合到mitmproxy的流程中了。也就是说flask提供的web服务必须依赖于请求经过mitmproxy!如果你用浏览器不配置代理直接访问flask端口是无法响应的!它的主要功能可以用来实现接口mock(就是你在flask上做好接口实现,然后mitmproxy将所有经过它访问example.com的请求全部会转发到flask上而不是去直接请求真实的example.com这个域名!)
二、使用多线程或进程同时启动2种服务的准备工作
1、mitmproxy程序文件mitmApp.py
from loguru import logger import asyncio from mitmproxy.options import Options from mitmproxy.tools import dump import mitmproxy.http class Action1: def request(self, flow: mitmproxy.http.HTTPFlow): logger.warning(f'{flow.request.url}, Beg---') return def response(self, flow): #flow.response = flow.response.make(404)#返回404 return #这里的addons 是给mitmdump -q -s main.py命令执行方式用的 addons = [ Action1(), #Action2() ] async def func_temp(host, port): opts = Options(listen_host=host, listen_port=port) # with_termlog设置为True会显示运行中mitmproxy遇到的错误;with_dumper是用来控制是否显示每个请求相关信息的 dm = dump.DumpMaster(opts, with_termlog=True, with_dumper=False) # python脚本直接运行需要按如下格式一个一个add添加 dm.addons.add(Action1()) # dm.addons.add(Action2()) try: await dm.run() except BaseException as e: print(e) dm.shutdown() def m(): logger.info('正在启动mitmApp……') asyncio.run(func_temp('127.0.0.1', 8080)) if __name__ == '__main__': m()
2、flask程序文件flaskApp.py
from loguru import logger from flask import Flask app = Flask("apptest") @app.route('/') def hello_world() -> str: logger.info('flask in') return 'Hello World!' def f(): app.run("127.0.0.1", 80) if __name__ == '__main__': #app.run("127.0.0.1",80) f()
上面这2个程序文件都可以单独运行,运行后分别访问127.0.0.1+端口号即可访问对于服务。
三、使用python多线程直接启动2服务
main-thread.py直接运行即可
from loguru import logger import threading import flaskApp import mitmApp def main(): th2 = threading.Thread(target=mitmApp.m, name="t2222", daemon=True) th2.start() th1 = threading.Thread(target=flaskApp.f, name="t1111", daemon=True) th1.start() # 等待所有线程结束 for t in (th1, th2): t.join() logger.info('zhu end') if __name__ == '__main__': logger.info('start') main()
四、使用python多进程直接启动2服务
main-process.py直接运行即可
from loguru import logger import multiprocessing import flaskApp import mitmApp def main(): p2 = multiprocessing.Process(target=mitmApp.m,) p2.start() p1 = multiprocessing.Process(target=flaskApp.f,) p1.start() # 等待所有进程结束 for process in (p1,p2): process.join() logger.info('zhu end') if __name__ == '__main__': logger.info('start') main()
因为这2个服务相对独立,也不涉及到共享数据访问或通信相对还是比较简单的。
基于互联网精神,在注明出处的前提下本站文章可自由转载!
本文链接:https://ranjuan.cn/python-run-mitmproxy-flask/
赞赏
微信赞赏支付宝赞赏
发表评论