注:本文隸屬於《Flask Web開發實戰》番外文章系列,文章列表見《Flask Web開發實戰番外文章索引》。python
在開發Web程序時,有時候會有這樣的需求:web
要實現上面的需求,咱們就須要程序可以「外網可見」。在《Flask Web開發實戰》第一章介紹啓動程序時,咱們說起了「外網可見」的內容。簡單來講,當你將Flask服務器監聽的主機地址設置爲0.0.0.0時,就可讓服務器外網可見。不過,這裏有一個前提,那就是你的服務器須要運行在擁有公網IP的主機上,由於咱們開發用的電腦一般不會有公網IP,因此這裏的外網只能是你的電腦所在的局域網,好比在客廳的電腦能夠訪問你的筆記本上運行的程序(經過你的筆記本的內網IP)。flask
事實上,藉助內網穿透/映射工具,咱們也可讓外網上的朋友訪問到運行在你的筆記本上的程序。這些工具會爲咱們分配一個域名A,你只須要在本地運行程序,並創建映射,那麼當其餘用戶(不只是你客廳的電腦,還多是北京的毛毛,或是美國的Peter)訪問A網址時,內網穿透工具就會把請求轉發到你的筆記本中,取回響應後再返回給用戶。具體流程以下所示:bash
在這篇文章,咱們會了解如何使用ngrok來實現這個目的。本文將會以一個簡單的Flask程序做爲示例,不過你也能夠替換爲任意的Web程序,好比使用Django、PHP或是JAVA等語言/框架編寫的Web程序。服務器
咱們先來編寫一個簡單的Flask程序:微信
from flask import Flask
app = Flask(__name__)
@app.route('/')
def hello():
return 'It works!'複製代碼
將上面的代碼保存爲app.py,而後打開一個命令行窗口,使用下面的命令運行這個程序:app
$ flask run複製代碼
若是尚未安裝Flask,能夠執行pip install flask
命令進行安裝(你也能夠建立一個虛擬環境,推薦使用Pipenv)。框架
默認狀況下,Flask內置的開發服務器會監聽本地機的5000端口,你可使用127.0.0.1:5000或localhost:5000訪問程序。工具
ngrok支持三大主流操做系統,安裝流程比較簡單,以下所示:測試
壓縮包裏包含一個名爲ngrok的二進制文件,咱們打開一個命令行窗口,切換到這個文件所在的目錄。如今能夠先執行help命令來測試一下。在Windows下,你可使用下面的命令:
> .\ngrok help複製代碼
或是直接執行:
> ngrok help複製代碼
在Linux/macOS下,則可使用下面的命令:
$ ./ngrok help複製代碼
由於咱們的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 <令牌值>
命令。
命令中的令牌值能夠在註冊後跳轉的控制面板頁面看到,以下圖所示:
你也能夠訪問dashboard.ngrok.com/auth查看。
每次創建映射,ngrok都會分配一個隨機子域的網址,若是你想擁有一個固定的域名,則要升級套餐。升級套餐的好處不少,但若是隻是臨時測試用的話,免費帳戶或是不註冊使用就足夠了。
注:更多的功能介紹能夠訪問ngrok.com/product查看。文圖均來自ngrok.com。