我可以获取flask_ngrok或py-ngrok的生成的IP地址或域名并将其返回到127.0.0.1/

问题描述

我正在尝试获取部署后生成的flask_ngrok或py-ngrok的域名或IP地址。我想将flask_app部署到localhost并在主页上获取新的IP地址或域名。

IE:如果我访问 127.0.0.1 / ,我希望它返回类似 您现在可以通过https://aaf8447ee878.ngrok.io/

登录

我尝试检查目录并阅读一些帮助,但仍然无法获取。在此先感谢❤

解决方法

添加

import atexit
import json
import os
import platform
import shutil
import subprocess
import tempfile
import time
import zipfile
from pathlib import Path
from threading import Timer

import requests


def _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_url


def _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_path

def 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

####################

不要导入flask_ngrok 最后在 name == 'ma​​in' 之前添加这个函数

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 函数中使用任何您想对 url 执行的操作替换打印,这将使您的代码编辑器/或终端崩溃

,

你不需要那个

global tunnel_url
def ngrok_url():
    while True:
        try:
            print(ngrok_address)
        except Exception as e:
                print(e)

导入集后也可以删除name == 'ma​​in'之前的线程部分 ngrok_address = '' 然后你可以在代码中的任何地方访问 ngrok_address

,

我发现最简单的方法是在用户访问网站时复制网址。你可以这样做...

@app.before_request
def before_request():
    global url
    url = request.url
    # url = url.replace('http://','https://',1)
    url = url.split('.ngrok.io')[0]
    url += '.ngrok.io'

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...