You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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.

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 21:15:02