猿问

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

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

IE:如果我访问127.0.0.1/我希望它返回类似的内容 You can now log in through https://aaf8447ee878.ngrok.io/

我尝试检查目录并阅读一些帮助,但我仍然无法得到它。预先感谢❤


冉冉说
浏览 141回答 3
3回答

茅侃侃

添加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 执行的任何操作,这将使您的代码编辑器/或终端崩溃

慕勒3428872

我发现最简单的方法是在用户访问该网站时复制网址。你可以通过...来做到这一点@app.before_requestdef before_request():    global url    url = request.url    # url = url.replace('http://', 'https://', 1)    url = url.split('.ngrok.io')[0]    url += '.ngrok.io'

有只小跳蛙

你不需要那个global tunnel_urldef ngrok_url():    while True:        try:            print(ngrok_address)        except Exception as e:                print(e)您也可以在导入集之后 删除name == ' main '之前的线程部分ngrok_address = '' ,然后您可以在代码中的任何位置访问 ngrok_address
随时随地看视频慕课网APP

相关分类

Python
我要回答