Flask集成ngrok运行API时如何生成固定的公网访问地址
解决ngrok启动Flask服务随机访问地址问题
核心原因
你当前使用的默认flask_ngrok配置调用的是未绑定身份的ngrok服务,平台每次启动都会自动分配随机临时域名,要固定地址需要先绑定ngrok账户并配置静态域名。
操作步骤
- 第一步:注册ngrok账户,进入后台获取你的专属authtoken,同时在「Domains」页面领取免费静态域名(免费版可领取1个固定域名,付费版可申请多个)
- 第二步:本地安装ngrok客户端后,执行命令绑定身份:
ngrok config add-authtoken 你获取的authtoken - 第三步:替换原代码中的
flask_ngrok为更灵活的pyngrok库,先执行安装:pip install pyngrok - 第四步:修改你的Flask启动代码,替换原来的
run_with_ngrok相关逻辑,示例如下:
from flask import Flask, flash, request, redirect, url_for, render_template import os from werkzeug.utils import secure_filename from PIL import Image, ImageOps # 引入pyngrok的NgrokTunnel from pyngrok import ngrok app = Flask(__name__, template_folder='./templates') # 这里替换成你在ngrok后台领取的固定域名 NGROK_FIXED_DOMAIN = "你的固定域名.ngrok.io" # 启动ngrok隧道指向本地5000端口(Flask默认端口),指定固定域名 public_url = ngrok.connect(5000, hostname=NGROK_FIXED_DOMAIN) print("固定访问地址:", public_url) UPLOAD_FOLDER = './static/' app.secret_key = "secret key" app.config['UPLOAD_FOLDER'] = UPLOAD_FOLDER app.config['MAX_CONTENT_LENGTH'] = 16 * 1024 * 1024 ALLOWED_EXTENSIONS = set(['png', 'jpg', 'jpeg', 'gif']) @app.route('/') def index(): return render_template('index.html') ######################################## def allowed_file(filename): return '.' in filename and filename.rsplit('.', 1)[1].lower() in ALLOWED_EXTENSIONS @app.route('/', methods=['POST']) def upload_image(): if 'file' not in request.files: flash('No file part') #return redirect(request.url) file = request.files['file'] if file.filename == '': flash('No image selected for uploading') #return redirect(request.url) if file and allowed_file(file.filename): filename = secure_filename(file.filename) #file.save(os.path.join(app.config['UPLOAD_FOLDER'], filename)) file.save(os.path.join(app.config['UPLOAD_FOLDER'], 'foto.jpeg')) #### Padronizando tamanho de foto basewidth = 400 # My image is a 200x374 jpeg that is 102kb large foo = Image.open('./static/foto.jpeg') wpercent = (basewidth/float(foo.size[0])) # I downsize the image with an ANTIALIAS filter (gives the highest quality) hsize = int((float(foo.size[1])*float(wpercent))) foo = foo.resize((basewidth,hsize), Image.ANTIALIAS) foo = ImageOps.exif_transpose(foo) foo.save("./static/fase1/foto.jpeg",optimize=True,quality=95) #foo.save("./static/foto2.jpeg", optimize=True,quality=50) ######### #### Meu código #os.remove('./static/foto.png') #os.remove('./static/uploads/foto2.png') os.system('python evala.py --trained_model=./weights/yolact_plus_resnet50_meat_3700_495900.pth --config=yolact_resnet50_meat_config --score_threshold=0.8 --top_k=100 --images=./static/fase1:./static/mask') #### # get directory path where you want to save the images #print('upload_image filename: ' + filename) flash('Image successfully uploaded and displayed below') return render_template('index.html', filename=filename) else: flash('Allowed image types are - png, jpg, jpeg, gif') return redirect(request.url) @app.route('/display/<filename>') def display_image(filename): return redirect(url_for('static', filename='uploads/foto2.jpeg'), code=301) if __name__ == '__main__': app.run()
注意事项
- 免费版ngrok静态域名有流量和带宽限制,仅适合测试使用,生产环境建议直接使用云服务器部署服务
- 如果你不想使用ngrok,也可以选择其他内网穿透工具,配置逻辑类似,都需要绑定专属域名后指定本地端口启动隧道
内容的提问来源于stack exchange,提问作者Curious G.
相关产品推荐
相关产品推荐

