iT邦幫忙

2021 iThome 鐵人賽

DAY 5
0
Modern Web

Flask系列 第 5

Day 5 基本 flask 函式 (2)

  • 分享至 

  • xImage
  •  

前言

今天會繼續探討其他的 flask 的函式。如果說昨天的函式是用來給予使用者回應,那今天提到的函式就是比較偏向接收使用者的請求。

範例一

首先來看個小小的例子。
app.py

from flask import Flask
from utils import get_url_map

app = Flask(__name__)

@app.route("/")
def url_map():
    get_url_map()
    return ""


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

utils.py

from flask import current_app

def get_url_map():
    print(current_app.url_map)

app.py 中,我們 import 了另外一個 module 裡面的 get_url_map 函式,而該函式則呼叫了從 flask 引入的 current_app,並 print 他的 url_map

這邊的重點就在該 current_app,他會被設定成一開始在 app.py 宣告的 app。要這麼做的原因在於我們無法直接從 app.py 引入我們設的 app,因為這樣會導致 circular import,所以 flask 提供了這個方法讓我們可以在其他 module 中存取到 app

範例二

昨天有提到怎麼新增及刪除 cookie,但卻沒有提到如何讀取現在的 cookie,因為他需要用到的不是 resposne,而是 request,也就是在這個範例要講的概念。不例外地,先從一個範例看起。

from flask import Flask, request, make_response

app = Flask(__name__)

@app.route("/", methods=["GET", "POST"])
def index_page():
    cookies = request.cookies
    if request.method == "GET":
        print(cookies["user"])
        return "GET /"
    if request.method == "POST":
        return "POST /"

@app.route("/set")
def set_cookie():
    response = make_response("")
    response.set_cookie("user", "cat")
    return response

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

這裡面有兩個路徑,第二個跟昨天設定 cookie 是一樣的,比較有趣的是第一個。先看到 request 這個物件,他一樣需要先 import。它代表了現在 flask 收到的 request,也就是說,在第一個路徑裡使用 request 和在第二個路徑裡使用會有不同的結果。
這個 request 內包含了很多資訊,這邊只挑兩個未來會用到的來說,分別是 request.cookiesrequest.method,其餘的可以參考 flask.Request 或其原始碼。

  • request.cookies 就是昨天沒有說的「讀取 cookie」的部分,他基本上是一個不可修改的 dict,所以在下面我們使用 dict 的方式 (cookies["user"]) 來存取這個 cookie 的值。
  • request.method 是一個字串,就是存取的 HTTP method,以此路徑為例,只有 GET、POST 兩種可能 (在 app.route() 定義過了),所以在下方的判斷就只做這兩個。這個方式非常常用,基本上每一個路徑都會用到。

除了上述這幾個之外,request.form 也很常用,顧名思義,他就是處理使用者提交的表單,但因為我們之後會使用 Flask-WTF,不會直接操作到他,所以暫時不提。

References

Get the data received in a Flask request


上一篇
Day 4 基本 flask 函式 (1)
下一篇
Day 6 jinja (1)
系列文
Flask30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言