Flask 函数库
Flask 函数库 ( 模组 ) 是一个轻量级的 Web 应用框架,提供了包括路由 ( Routes )、样板 ( templates ) 和权限 ( authorization) 等功能,只需要简单的几行程序码,就能轻松架设网站或建构网络服务,许多 Python 所实现的聊天机器人应用 ( 例如 LINE BOT ),都会使用 Flask 来完成。
快速导览:
安装 Flask 函数库
如果是使用 Colab 或 Anaconda,默认已经安装了 requests 函数库,不用额外安装,如果是本机环境,输入下列指令,就能安装 requests 函数库 ( 依据每个人的作业环境不同,可使用 pip 或 pip3 或 pipenv )。
由于使用 Flask 会启动本机环境网页服务器,若要使用 Google Colab 必须搭配 ngrok 实作 ( 参考:Google Colab 使用 ngrok ),建议第一次先使用 Anaconda Jupyter 进行操作 ( 参考:使用 Anaconda )。
pip install Flask
import Flask
要使用 Flask 必须先 import Flask 函数库,或使用 from 的方式,单独 import 特定的类型。
from flask import Flask
建立第一个网页服务
下方的程序码执行后,会建立一个基本的网页服务。
注意,如果使用 Colab 或 Anaconda Jupyter,同一个程序启用网页服务后,该程序里其他片段的程序码将会无法启动 ( 按下执行纽启动 )。
from flask import Flask # 載入 Flask
app = Flask(__name__) # 建立 app 變數為 Flask 物件,__name__ 表示目前執行的程式
@app.route("/") # 使用函式裝飾器,建立一個路由 ( Routes ),可針對主網域 / 發出請求
def home(): # 發出請求後會執行 home() 的函式
return "<h1>hello world</h1>" # 執行函式後會回傳特定的網頁內容
app.run() # 執行
网页服务建立后,在开发画面里可以看到已经启动 127.0.0.1:5000 的网页服务,其中 127.0.0.1 表示本机环境的服务器 ip,5000 则是埠号 port。
服务建立完成后,点击产生的网址,或直接在浏览器的网址列输入网址,就能看到网页上出现 hello world 的文字。
设定 GET 与 POST 方法
使用 @app.route 建立路由时,默认采用“GET”的方法,可透过 method 参数设定 GET 或 POST。
如何简单的区分 GET 和 POST?GET 方法可以透过网址进行沟通,以也就是透过网址列传送所有的参数内容,POST 方法则是将数据放在 message-body 进行传送,无法单纯透过网址列传送。
下方的程序码会启用一个主网域为 POST 方法的网页服务。
from flask import Flask
app = Flask(__name__)
@app.route("/", methods=['POST'])
def home():
return "<h1>hello world</h1>"
app.run()
如果透过浏览器输入网址,就会得到 Method Not Allowed 的错误消息。
如果改用 requests 函数库的 post 方法,就能顺利读取并印出内容 ( 参考:Requests 函数库 )。
import requests
web = requests.post('http://127.0.0.1:5000/') # 使用 post 方法
print(web.text) # 讀取並印出 text 屬性
设定连线埠号 port
使用 app.run 执行时,可以设定 port 参数来指定埠号 port,或设定 host 为 0.0.0.0 就能采用本机实际分配到的 IP 作为网址,下方的程序执行后,会产生 192.168.XXX.XXX:5555 的网址。
from flask import Flask
app = Flask(__name__)
@app.route("/")
def home():
return "<h1>hello world</h1>"
app.run(host="0.0.0.0", port=5555)
变数规则
使用 @app.route 可以指定特定的网址路径,当用户针对特定的网址发送请求后,就会执行对应的行为,下方的程序码执行后,打开三个网址会出现三种不同的结果。
from flask import Flask
app = Flask(__name__)
@app.route("/")
def home():
return "<h1>hello world</h1>"
@app.route("/ok")
def ok():
return "<h1>ok</h1>"
@app.route("/yes")
def yes():
return "<h1>yes</h1>"
app.run()
如果要让程序更有弹性,则需要加入“变数”辅助,下方的程序执行后,就会在网页中显示根目录后方的文字。
from flask import Flask
app = Flask(__name__)
@app.route("/")
def home():
return "<h1>hello world</h1>"
@app.route("/<msg>") # 加入 <msg> 讀取網址
def ok(msg): # 加入參數
return f"<h1>{msg}</h1>" # 使用變數
app.run()
在设定变数时,可以使用 Flask 提供的转换器功能,指定内容的类型,Flask 提供了五种转换方式:
| 类型 | 说明 |
|---|---|
| string | 默认值,表示不包含斜线的文字。 |
| int | 正整数。 |
| float | 正浮点数。 |
| path | 路径,类似 string,但可以包含斜线。 |
| uuid | UUID 字串。 |
下方的程序执行后,会在网页显示根目录后方的网址内容。
from flask import Flask
app = Flask(__name__)
@app.route("/")
def home():
return "<h1>hello world</h1>"
@app.route("/<path:msg>") # 加入 path: 轉換成「路徑」的類型
def ok(msg):
return f"<h1>{msg}</h1>"
app.run()
读取参数
实作网页应用时,常常会使用网址的参数 ( GET ) 或 message-body ( POST ) 进行消息的沟通,透过 Flask 提供的 request 方法,就能读取传递的参数内容。
当服务使用 GET 方法时,request.args 会将网址的参数读取为 tuple 格式,tuple 第一个项目为参数,第二个项目为值。
网址参数由网址后方加上 ? 开始,不同参数以 & 区隔,例如
127.0.0.1:5000?name=oxxo&age=18,就具有 name 和 age 两个参数。
from flask import Flask, request # 載入了 request
app = Flask(__name__)
@app.route("/")
def home():
print(request.args) # 使用 request.args
return "<h1>hello world</h1>"
app.run()
当服务使用 POST 方法时,request.form 会将 message-body 读取为 tuple 格式,tuple 第一个项目为参数,第二个项目为值。
from flask import Flask, request
app = Flask(__name__)
@app.route("/",methods=['POST'])
def home():
print(request.form) # 使用 request.form
return "<h1>hello world</h1>"
app.run()
当另外一组程序发送 POST 方法的请求时,就可以从后台看到执行的结果。
import requests
data = {'name': 'oxxo', 'age': '18'}
web = requests.post('http://127.0.0.1:5000/', data=data) # 發送 POST 請求
print(web.text)
不论是使用 request.args 或 request.form,都能继续透过的 get 方法取得指定参数的值,下方的程序会取得 name 和 age 的值,接着将其显示在网页中。
from flask import Flask, request, render_template
app = Flask(__name__)
@app.route('/')
def home():
name = request.args.get('name')
return render_template('test.html', name=name)
app.run()
使用网页样板
呼叫 Flask 所建立的网页服务后,除了可以在网页上显示特定的文字,只要额外加载 render_template 方法,就能显示位于“同一层的 templates 文件夹”里的网页样板,下方为一个基本的网页样板,可以读取并显示 name 参数的内容 ( 使用 Jinja2 样板语法 )。
<!DOCTYPE html>
<html>
<head>
<title>test</title>
</head>
<body>
{% if name %}
<h1>Hello {{ name }}!</h1>
{% else %}
<h1>Hello, World!</h1>
{% endif %}
</body>
</html>
网页样板完成后,执行下方的程序,只要网址具有 name 的参数,就会透过网页样板显示在网页中。
from flask import Flask, request, render_template # 載入 render_template
app = Flask(__name__)
@app.route('/')
def home():
name = request.args.get('name')
return render_template('test.html', name=name) # 使用網頁樣板,並傳入參數
app.run()
微信扫码关注
抖音扫码关注