茅侃侃
添加import atexitimport jsonimport osimport platformimport shutilimport subprocessimport tempfileimport timeimport zipfilefrom pathlib import Pathfrom threading import Timerimport requestsdef _run_ngrok(): ngrok_path = str(Path(tempfile.gettempdir(), "ngrok")) _download_ngrok(ngrok_path) system = platform.system() if system == "Darwin": command = "ngrok" elif system == "Windows": command = "ngrok.exe" elif system == "Linux": command = "ngrok" else: raise Exception(f"{system} is not supported") executable = str(Path(ngrok_path, command)) os.chmod(executable, 777) ngrok = subprocess.Popen([executable, 'http', '5000']) atexit.register(ngrok.terminate) localhost_url = "http://localhost:4040/api/tunnels" # Url with tunnel details time.sleep(1) tunnel_url = requests.get(localhost_url).text # Get the tunnel information j = json.loads(tunnel_url) tunnel_url = j['tunnels'][0]['public_url'] # Do the parsing of the get tunnel_url = tunnel_url.replace("https", "http") return tunnel_urldef _download_ngrok(ngrok_path): if Path(ngrok_path).exists(): return system = platform.system() if system == "Darwin": url = "https://bin.equinox.io/c/4VmDzA7iaHb/ngrok-stable-darwin-amd64.zip" elif system == "Windows": url = "https://bin.equinox.io/c/4VmDzA7iaHb/ngrok-stable-windows-amd64.zip" elif system == "Linux": url = "https://bin.equinox.io/c/4VmDzA7iaHb/ngrok-stable-linux-amd64.zip" else: raise Exception(f"{system} is not supported") download_path = _download_file(url) with zipfile.ZipFile(download_path, "r") as zip_ref: zip_ref.extractall(ngrok_path)def _download_file(url): local_filename = url.split('/')[-1] r = requests.get(url, stream=True) download_path = str(Path(tempfile.gettempdir(), local_filename)) with open(download_path, 'wb') as f: shutil.copyfileobj(r.raw, f) return download_pathdef start_ngrok(): global ngrok_address ngrok_address = _run_ngrok() print(f" * Running on {ngrok_address}") print(f" * Traffic stats available on http://127.0.0.1:4040")def run_with_ngrok(app): """ The provided Flask app will be securely exposed to the public internet via ngrok when run, and the its ngrok address will be printed to stdout :param app: a Flask application object :return: None """ old_run = app.run def new_run(): thread = Timer(1, start_ngrok) thread.setDaemon(True) thread.start() old_run() app.run = new_run####################不要在name == ' main '之前导入flask_ngrok添加此函数def ngrok_url(): global tunnel_url while True: try: print(ngrok_address) except Exception as e: print(e)并在 app.run() 之前放置thread = Timer(1, ngrok_url)thread.setDaemon(True)thread.start()并运行警告:如果您不希望在 ngrok url 函数中将 print 替换为您想要对 url 执行的任何操作,这将使您的代码编辑器/或终端崩溃