12

使用ngrok让你的本地Flask程序外网可访问

 3 years ago
source link: https://greyli.com/use-ngrok-to-expose-your-local-application/
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

使用ngrok让你的本地Flask程序外网可访问

注:本文隶属于《Flask Web开发实战》番外文章系列,文章列表见《Flask Web开发实战番外文章索引》

在开发Web程序时,有时候会有这样的需求:

  • 让朋友可以访问到你本地运行的程序
  • 在本地测试各类服务(比如Telegram机器人、微信公众号等)
  • 有一台废弃的电脑,你想让它作为一台服务器来运行你的博客程序,或是运行其他简单的程序

要实现上面的需求,我们就需要程序能够“外网可见”。在《Flask Web开发实战》第一章介绍启动程序时,我们提及了“外网可见”的内容。简单来说,当你将Flask服务器监听的主机地址设置为0.0.0.0时,就可以让服务器外网可见。不过,这里有一个前提,那就是你的服务器需要运行在拥有公网IP的主机上,因为我们开发用的电脑通常不会有公网IP,所以这里的外网只能是你的电脑所在的局域网,比如在客厅的电脑可以访问你的笔记本上运行的程序(通过你的笔记本的内网IP)。

事实上,借助内网穿透/映射工具,我们也可以让外网上的朋友访问到运行在你的笔记本上的程序。这些工具会为我们分配一个域名A,你只需要在本地运行程序,并建立映射,那么当其他用户(不仅是你客厅的电脑,还可能是北京的毛毛,或是美国的Peter)访问A网址时,内网穿透工具就会把请求转发到你的笔记本中,取回响应后再返回给用户。具体流程如下所示:

how-ngrok-work.png

左边是美国的Peter,右边是你

在这篇文章,我们会了解如何使用ngrok来实现这个目的。本文将会以一个简单的Flask程序作为示例,不过你也可以替换为任意的Web程序,比如使用Django、PHP或是JAVA等语言/框架编写的Web程序。

运行本地服务器

我们先来编写一个简单的Flask程序:

from flask import Flask
app = Flask(__name__)
@app.route('/')
def hello():
    return 'It works!'

将上面的代码保存为app.py,然后打开一个命令行窗口,使用下面的命令运行这个程序:

$ flask run

如果还没有安装Flask,可以执行pip install flask命令进行安装(你也可以创建一个虚拟环境,推荐使用Pipenv)。

默认情况下,Flask内置的开发服务器会监听本地机的5000端口,你可以使用127.0.0.1:5000或localhost:5000访问程序。

安装和配置ngrok

ngrok支持三大主流操作系统,安装流程比较简单,如下所示:

  1. 访问https://ngrok.com/download
  2. 根据操作系统下载对应的压缩包
  3. 解压到合适的目录

压缩包里包含一个名为ngrok的二进制文件,我们打开一个命令行窗口,切换到这个文件所在的目录。现在可以先执行help命令来测试一下。在Windows下,你可以使用下面的命令:

> .\ngrok help

或是直接执行:

> ngrok help

在Linux/macOS下,则可以使用下面的命令:

$ ./ngrok help

建立映射/HTTP隧道

因为我们的Flask程序已经运行在本地机的5000端口,我们只需要启动ngrok服务,输入对应的端口即可建立映射,或者说建立一条HTTP隧道:

$ ./ngrok http 5000

附注 在Windows下可以使用ngrok http 5000命令。

输出的信息中包含ngrok为你随机分配的域名:

Session Status online
Account Grey Li (Plan: Free)
Version 2.2.8
Region United States (us)
Web Interface http://127.0.0.1:4040
Forwarding http://d15a56b1.ngrok.io -> localhost:5000
Forwarding https://d15a56b1.ngrok.io -> localhost:5000
Connections ttl opn rt1 rt5 p50 p90
0 0 0.00 0.00 0.00 0.00

其中的https://d15a56b1.ngrok.io就是为你分配的可以外部访问的网址,所有发向这个网址的请求都会转发到你的本地机5000端口,即localhost:5000或127.0.0.1:5000。这时访问这个网站会看到我们上面程序中定义的输出“It works!”。

当有请求进入后,你可以在这里看到请求列表。另外,你也可以访问http://127.0.0.1:4040访问ngrok本地程序提供的Web监控页面。

注册账户与付费套餐

在上面的流程里我们并没有介绍注册账户,因为这是可选的。未注册时,你执行ngrok http命令的输出会和上面稍微有些不同,你会看到下面两行:

Session Status online
Session Expires 7 hours, 42 minutes

这是因为未注册账户每个会话只会维持8小时,过期后你需要重新启动。

注册用户没有这个限制,注册相当简单,这里不再赘述,注册完成后需要执行下面的命令连接本地ngrok程序:

$ ./ngrok authtoken <令牌值>

附注 Windows系统可以使用ngrok authtoken <令牌值>命令。

命令中的令牌值可以在注册后跳转的控制面板页面看到,如下图所示:

ngrok-token.png

你也可以访问https://dashboard.ngrok.com/auth查看。

每次建立映射,ngrok都会分配一个随机子域的网址,如果你想拥有一个固定的域名,则要升级套餐。升级套餐的好处很多,但如果只是临时测试用的话,免费账户或是不注册使用就足够了。

注:更多的功能介绍可以访问https://ngrok.com/product查看。文图均来ngrok.com

本条目发布于2018年9月27日。属于计算机与编程分类,被贴了 Flaskngrok服务器 标签。 ← 在Stack Overflow上拿到了Flask铜牌徽章 欢迎来 PyCon China 2018 听我的演讲 →

撰写评论 取消回复

电子邮件地址不会被公开,必填项已用*标出。

评论

姓名 *

电子邮件 *

站点

在此浏览器中保存我的名字、电邮和网站。

当有人回复我时,发送电子邮件提醒我。


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK