问题描述
我正在尝试获取部署后生成的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 == 'main' 之前添加这个函数
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 == 'main'之前的线程部分
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'