Day 3 基本范例

前言

今天会介绍一些 flask 的基本函式,所以我们还没有正式开始写专案。这些基本的函式十分常用,甚至有些会在几乎每个有关 flask 的档案中反覆出现,所以我选择放在最前面介绍,未来如果有忘记的可以回来看一下。

简单的范例

我们先从一个简单的范例来看起。请注意如果要实作的话档名务必使用 app.py,後面会解释。

from flask import Flask

app = Flask(__name__)

@app.route("/", methods=["GET", "POST"])
def index():
    return "Index Page"

app.run(host="127.0.0.1", port=8080, debug=True)

接着只要在 command line 下指令:python app.py,flask 就会把这个网站建立起来,可以打开浏览器输入 127.0.0.1:8080,没有意外的话可以看到有一行 Index Page 写在上面。
接下来我会逐行解释这个简单的网站:

  • 第一行我们引入 flask。
  • 第三行定义一个变数 app 作为这个 flask application 的实体。
  • 第五行使用装饰器注册一个路径 /,这边要注意的是 flask 要求每个路径都要用 / 开头,如 /meow/user 等等,meow 是不被允许的,会跳出 ValueError: urls must start with a leading slashmethods 是一个 list,里面是这个路径所允许的 HTTP method,这边我用 GET 和 POST 为例。如果对装饰器不熟悉可以阅读此篇,在此处我不多加解释其功用。
  • 第六行开始定义一个函式来处理通向 / 的 request,这个函式名称随意,但未来会用到。
  • 第七行回传一个字串 Index Page,也就是刚刚在浏览器看到的东西。它的目的就是回传 HTML 或是 response (後面会提到),未来还会加入更多复杂的方式来 render 网页。
  • 第九行使用 app.run() 让他跑,并用 hostport 来指定要跑在哪里,如果是在有公开 IP 的服务器上可以直接把 host 设为该 IP,最後的 debug=True 表示现在是开发模式,flask 会打开一些 debug 的工具,等等会解释。但未来基本上不会使用此方法,所以不会介绍太多。

要把这个网站跑起来还有第二个方法,可以在命令列输入 flask run,这个指令是跟着 pip install flask 一起安装的。

但要注意的是,使用这个指令会自动把程序码里面的 app.run() 忽略,也就是说,他会自动忽略上面的 hostport,在未指定的情况下,预设 host=127.0.0.1port=5000。如果要指定的话,需要传入参数,如 flask run --host 127.0.0.1 --port 8080,这样会达到和上面相同的效果。

此外,理论上我们需要设定 FLASK_APP 这个环境变数,它的作用是告诉 flask 你的 flask application 在哪里。当没有设定的时候,他会自动去寻找 app.pywsgi.py 或是里面有 create_appmake_app 函式的模组 (後面会提到)。也就是说,如果这时候档名不是 app.py,他刚刚就不会顺利执行了。

最後还有一个要注意的点,在执行的时候 (两种方法都是) 画面应该会跑出一行红字:WARNING: This is a development server. Do not use it in a production deployment.,这表示这个执行方法并不适合用於 production。但我们现在只是用於开发,所以可以设定 FLASK_ENV=DEVELOPMENT 这个环境变数,来告诉 flask 现在使用的环境为开发环境。在更改为开发环境的同时,flask 会打开一些 debug 相关的功能:

  • debugger,让你在程序码错误的时候直接在网页上显示 error traceback,而非黑底白字的 500 Internal Server Error
  • debug console,可以在浏览器上输入 127.0.0.1:8080/console,flask 有一个内建的 interactive debugger 可以让你跟系统互动。
  • reloader,在修改 flask 有关的档案时,flask 会自动重启并套用刚刚的更动,可以免去一直重开的麻烦。

另一个范例

稍微修改一下刚刚的程序码,加入一些新东西。

from flask import Flask

app = Flask(__name__)

@app.route("/", methods=["GET", "POST"])
def index():
    return "Index Page"
    
@app.route("/dynamic/<int:id>", methods=["GET"])
def dynamic_url_page(id):
    return str(id)

app.run(host="127.0.0.1", port=8080, debug=True)

在这个范例里,我们新增了第二个路径 /dynamic/<int:id>,前面的 /dynamic 跟上面的 / 是接近的,新的东西在後面的 /<int:id>

他是 flask 提供的「动态路径」功能,冒号前面的 int 表示他的型别,後面的 id 则是变数名称,而这个变数需要在下方处理 request 的函式中作为一个参数。这时候存取 /dynamic/1,flask 就会传回 1,但如果存取 /dynamic/meow,那就会传回 404 Not Found,因为 meow 并非一个整数,并没有符合这条路径规则。

我们也可以把规则写成 /dynamic/@<int:id>,这样一来,存取 /dynamic/@1 就会传回 1。

值得一提的是,如果在回传的时候没有先把 id 转型成 str,那 flask 会有错误:TypeError: The view function did not return a valid response. The return type must be a string, dict, tuple, Response instance, or WSGI callable, but it was a int.,这表示你回传的不是正确的型别,合法的型别只有 strResponse (未来会提到) 等等,其余可以参考附录一。

结语

今天看了两个简单的 flask 范例,基本上这样就足以建出一个简单的小网站,但未来我们还会继续探讨其他函式。

References

Flask: return value of view function
Command Line Interface


<<:  [Day1] iThome 铁人赛,I'm back!!!!!!!!!!

>>:  Day 03 HTML<列表标签>

[D20] 物件侦测(1)

物件侦测(Object Detection)是影像辨识中重要的一环~ 物件侦测就是在照片或影片等图像...

Day.3 环境部署 - 从安装开始 (GCP & Percona Mysql )

在以下环境搭建内容会示范如何从GCP部署机器(VM)至安装Percona(mysql)的过程。 作业...

CDN 与网站资讯安全服务简介

前言 当一个网站取得 Public IP 与 internet 连接时,也就表示网站正开始面对来自全...

【6】为什麽 Batch size 通常都是设成2的n次方

Colab连结 有没有人发现几乎每个在开源的专案上,Batch size 都是2的N次方,像32, ...

[C#] 取得证交所台股价格的 3 种实用方法(附范例下载)

想要在网路上取得台股最新的股价有许多种方式,其中一种免费的方式就是直接向证交所网站取得股价资料,这次...