Day 4 基本 flask 函式 (1)

前言

昨天提到了一些 flask 的例子,而今天会继续深入讨论他提供的一些函式,可以让写出来的网页有更多的变化。

范例一

首先我们来看个例子,这个网页里面包含了数个路径,我们一一来检视。

from flask import Flask, redirect, url_for, abort

app = Flask(__name__)

@app.route("/", methods=["GET", "POST"])
def index():
    return "Index Page"
    
@app.route("/google")
def redirect_to_google():
    print("Route 1")
    return redirect("https://google.com")

@app.route("/google2")
def redirect_to_google_2():
    print("Route 2")
    return redirect(url_for("redirect_to_google"))

@app.route("/dont_see")
def dont_see():
    abort(403)


app.run(host="127.0.0.1", port=8080, debug=True)
  • 第一个路径跟昨天的一样,就是首页。
  • 第二个路径会帮我们重新导向 (redirect) 至 google,他使用了 redirect 这个函式,而我们需要先从 flask import 他。再来要注意的是,并不是单单 redirect(url) 就可以了,前面必须要加上 return
  • 第三个路径一样会帮我们重新导向至 google,但他的方法是先重新导向到第二个路径,再由他重新导向至 google。其中用到了 url_for 这个函式,一样要先 import。在 url_for() 填的参数是要导向的函式名称,请注意是函式名称 (字串),而非函式本身,也不是该路径,如果要看完整对应表的话可以使用 app.url_map。他会找出该函式对应到的路径,以此处为例,url_for("redirect_to_google") 会回传 "/google",然後就会变成 return redirect("/google"),然後就会导向到刚刚的第二个路径。
  • 最後一个路径会直接回传 403 Forbidden。这里使用的是 abort 函式,一样需要先 import。他很直接,就是会直接回传指定的 指定的 HTTP status code,但必须要是一个错误的 code (404、418、500 等等)。这里要注意的是,他不需要 return,但他跟 return 一样,都会直接把後面的程序忽略。有了这个函式,我们可以更轻松的处理错误。如果不想要直接 abort 还想要有其他回传东西的话,那可以改用 return "", 404,空字串的部分可以自由改动,flask 会回传你指定的 HTML 并附加该 HTTP status code。

范例二

昨天有提到 return 只有某些型别可用,我举的例子是 strResponse,这里要说明的就是後者。这边一样先提供一个范例,它包含了两个路径。


from flask import Flask, make_response

app = Flask(__name__)

@app.route("/")
def set_cookie_page():
    response = make_response("meow1")
    response.headers["Content-Type"] = "text/html"
    response.set_cookie("user", "somebody")
    return response

@app.route("/del")
def del_cookie_page():
    response = make_response("meow2")
    response.delete_cookie("user")
    return response


app.run(host="127.0.0.1", port=8080, debug=True)
  • 第一个路径中,我们先宣告了一个 response 变数,使用到了 make_response 函式,他也需要 import。这个函式的参数基本上就是在前面的例子中 return 的内容,如 redirect、一般的字串、或是未来会提到的 render_template 等等,这边方便起见就随便放一个字串。接下来我们可以设定该 response 的标头,此处用常见的 Content-Type 作为范例,标头是一个 dict,所以可以直接用此方式更改。再接着我们设定 cookie,使用的是 Response 物件的 set_cookie 函式,第一个参数是 cookie 名称,第二个参数是 cookie 的值。最後我们传回这个 response,可以打开开发人员工具来看看是否都有跑出正确的样子。
  • 第二个路径看起来就是第一个路径的相反,他会删除 cookie。要使用的是 Response 物件的 delete_cookie 函式,他只需要接 cookie 的名称就可以删除。这时候打开浏览器看 cookie 应该可以看到 user 栏位已经被清空。这边可以注意的是,在网路上查有些人会直接 set_cookie("user", expire=0),这样也是正确的,事实上,delete_cookie 这个函数的实作就是这样做,只是把它包起来罢了。

这边的 set_cookiedelete_cookie 都还有很多参数可以加,像是刚刚的 expire 等等,但就不再这边多说了,有需要的人可以看一下他的原始码,注解应该都蛮清楚的。

结语

今天看了一些进阶的 flask 函式,有了这些函式可以让我们能够更细腻地设计网站。在本篇文章的内容都没有深入讨论该函式的其他用法,如果有兴趣的人可以再看看文件及原始码。

References

How do I set response headers in Flask?
How to set cookie in Python Flask?


<<:  HTML基础介绍(2)

>>:  4.移转 Aras PLM大小事-Agile 汇出 Part & BOM (2)

Day 27. Hashicorp Vault: Install Vault on Kubernetes

Hashicorp Vault:Install Vault on Kubernetes 今天介绍如何...

联储局加息步伐明朗化 炒股想胜算高最好买………

美国联邦储备局最新公布的议息结果「鹰味浓郁」,但整体符合市场预期。美国的加息步伐在会议之前还未清晰,...

成熟度模型中构建安全性 (Building Security In Maturity Model :BSIMM)

CMMI、CMMC、BSIMM 和 SAMM 是评估软件开发能力的好模型。但是BSIMM 是衡量一个...

Annotation 介绍

Annotation 很常写 Java 或是 Kotlin 的朋友对 annotation 大概不陌...

初探 Vaadin on Kotlin - day03

什麽是 Vaadin-on-Kotlin? Vaadin-on-Kotlin (VoK) 是基於 V...