Day 13 Flask Route

首先,作为一个 Web 的框架,主要就是当作网页的 Server 在运作的,网页中必不可少的就是网址了对吧,那麽 Flask 至少要可以针对请求的网址进行回传资料吧!

在实际开始做之前,先简单说一下 POSTMAN 这个东西,POSTMAN 主要是让你可以更自由的选择要怎麽送出 url 的一个工具。

基本上到 POSTMAN官网下载页面 下载安装(就下一步到底,然後就安装完了),然後申请一个帐号(要啥填啥就对了,也可以使用 google 帐号)登入就可以使用了,打开後会看到类似这样的画面,红色区域(中上)是输入 url 跟 method 的区域;绿色区域(右上)是送出;蓝色区域(中间)是输入要携带的参数;橘色区域(下方)是显示回传结果的地方。如果一个不够,红色区域的上方还有加号可以增加分页,让你可以一次可以使用更多种不同的东西。

基本路由

那要回复请求要怎麽写呢?

@app.route('<url>', methods=['<method>'])
def <function name>():
    # TODO

回复请求的方式大概是这样,function 前面加个 Day 08 讲到的装饰器。url 就填网址,methods (可写可不写,里面的 method 要大写,要有 s,当初为了这个 s 找了一下午的bug)就是送的方式,function name 就自己取个有意义的名字,function 里面就写这个 function 要干嘛。

顺便再说一下,url 可以使用 [A-Z, a-z, 0-9, -] 这几个字符组成。那麽工具齐全了,就实际来做几个试试吧!

app.py

from flask import Flask

app = Flask(__name__)


# 首页,不限 methods
@app.route('/')
def index():
    return 'Hello World'


# POST methods(POST 大写,要有s跟中括号)
@app.route('/posttest', methods=['POST'])
def posttest():
    return 'post test success'


if __name__ == '__main__':
    app.run()

接着执行

# 使用虚拟环境的输入
$ pipenv run python app.py

# 不使用虚拟环境的输入
$ python app.py

然後打开安装好了的 POSTMAN,选好 POST 以及输入 url: http://127.0.0.1:5000/posttest,接着送出就会看到

在这边也可以试试,如果换成 GET 会发生什麽事?

回传了一个看起来很复杂的东西对吧,把回传区块的 Pretty 改成选择 Preview 看看。

是不是很清楚的写着不合的 method 啦,基础大概就这样。

To / or not to /

如果上各种网站时,你有注意到网址的结尾有些有 /;有些没有 /,看其他人的网站时,有没有 / 都不会影响你浏览。不过自己在写就不一样了,那 url 结尾有没有 / 到底差在哪呢?

@app.route('/A/')
def a_page():
    return 'A page'


@app.route('/B')
def b_page():
    return 'B page'

简单说有 / 就像资料夹。如果输入的是没有 / 的 url,网站没有无 / 的 url 的话,就会重新导向有 / 的 url。就相当於没有找到档案就打开同名的资料夹里面的默认档案。

而没有 / 就像档案。如果输入的是有 / 的 url,网站没有有 / 的 url 的话,就会 404 Not Found,不会帮你重新导向。

这两种方式都可以使用,一开始只需要知道 /A//A 是两个不同的网页就行了(如果真的要说的话会扯到SEO,那又可以开另外一个系列了)。

url_for

如果现在要回传一个网址给使用者,而这个网址又很长,那当然不可能使用ctrl + cctrl + v 大法对吧。所以就需要使用到 url_for() 这个功能,那要如何使用呢?

url_for('<function name>')

function name 就填那个路由的 function 名称,在使用之前记得 import url_for(from flask import url_for)。实作一个会更清楚:

@app.route('/')
def index():
    return '<a href="{}">login</a>'.format(url_for('login'))


@app.route('/login/')
def login():
    return 'login page'

这样的好处就是可以不用在意 login 的 url,即使之後改掉 url,只要 function 名称还是 login 就还是可以对到正确的位置。

redirect

如果现在需要将使用者导向到另一个页面,可以怎麽做呢?

redirect('<url>')
# or
redirect(url_for('<function name>'))

这样就可以直接将使用者到到另一个网址了,在使用之前一样要 import redirect(from flask import redirects)。大概就像这样:

@app.route('/')
def index():
    return '<a href="{}">login</a>'.format(url_for('login'))


@app.route('/login/')
def login():
    # Authenticate user
    if auth_result == 'success':
        return redirect(url_for('home'))
    else:
        return redirect(url_for('index'))


@app.route('/home/')
def home():
    return 'home page'

大概就像这样,处里完就会将使用者导向另一个页面,不需要让使用者自己手动跳转,提高使用者体验。

那麽就大概这样,处理好路由,网站的形状就出来了,接着就可以处力其他东西了。

大家掰~掰~


<<:  # Day13--你到底爱不爱我?我们来解包这个Optional

>>:  Turbo Pascal 语言和你 SAY HELLO!!

使用 Google 表单快速建立实名制出入场所登记资料 COVID-19

免接触 免拿笔签名 流程 人进场 --> 手机扫描 QR --> 填写资料 -->...

改造VSCode,好看又好用

善用套件,提升效率 VS Code 有许多套件用,这里个人推荐几款能提升效率的套件。 Auto Re...

讯息是怎麽进到网际网路的(二)?区网内的装置:AP, Switch, Router

聊完了区网中设备与设备的连结後,我们来近距离看看这三大设备:AP, Switch 和 Router ...

Build your own environment in Visual Studio Code for Python

Introduction As a python coder, you want to find a...

{DAY 16} Pandas 学习笔记 part.2

前言 Pandas 是强大的资料科学分析工具,结合前几天所学的NumPy特性 提供方便读取及使用的资...