anonymous的flask學習筆記(3)——flask設置路由動態參數和重定向操作

flask設置路由動態參數和重定向操作

路由動態參數

  • 通過視圖函數綁定的url路徑來傳遞動態參數
    • 獲取int類型動態參數,此時前端傳入的動態參數必須是int類型
      @app.route("/param/<int:param>")
      def param_int(param):
          return f"<h1>傳入的int類型參數是:{param},提示:傳入其他類型參數會報錯!</h1>"
      
      此時運行flask服務,前端訪問http://127.0.0.1:5000/param/198 ,前端展示爲傳入的int類型參數是:198,提示:傳入其他類型參數會報錯!
    • 獲取float類型動態參數,此時前端傳入的動態參數必須是float類型
      @app.route("/param/<float:param>")
      def param_float(param):
          return f"<h1>傳入的float類型參數是:{param},提示:傳入其他類型參數會報錯!</h1>"
      
      此時運行flask服務,前端訪問http://127.0.0.1:5000/param/9.9 ,前端展示爲傳入的float類型參數是:9.9,提示:傳入其他類型參數會報錯!
    • 獲取path路徑類型動態參數**(動態參數可以包含’/’)**,此時前端傳入的動態參數必須是path類型
      @app.route("/param/<path:param>")
      def param_path(param):
          return f"<h1>傳入的path類型參數是:{param},提示:傳入其他類型參數會報錯!</h1>"
      
      此時運行flask服務,前端訪問http://127.0.0.1:5000/param/api/meta/translation ,前端展示爲傳入的path類型參數是:api/meta/translation,提示:傳入其他類型參數會報錯!
    • 獲取string類型動態參數**(動態參數不可以包含’/’)**,此時前端傳入的動態參數必須是string類型
      @app.route("/param/<string:param>")
      def param_string(param):
          return f"<h1>傳入的string類型參數是:{param},提示:傳入其他類型參數會報錯!</h1>"
      
      此時運行flask服務,前端訪問http://127.0.0.1:5000/param/我叫小花花,今天21歲了 ,前端展示爲傳入的string類型參數是:我叫小花花,今天21歲了,提示:傳入其他類型參數會報錯!
  • 通過request來獲取前端url路徑使用?key1=value1&key2=value2的形式來獲取傳入的動態參數。
    @app.route("/hello")
    def say_hello():
        name = request.args.get('name')
        age = request.args.get('age')
        return "<h1>hello " + name + ",你的年齡是" + age + "。</h1>"
    
    此時運行flask服務,前端訪問http://127.0.0.1:5000/hello?name=小花花&age=21 ,前端展示爲hello 小花花,你的年齡是21。;訪問http://127.0.0.1:5000/hello?name=熊大&age=10 ,前端展示爲hello 熊大,你的年齡是10。
  • 補充知識:可以通過Python標準庫uuid來生成一個唯一ID。每次生成的uuid都是唯一的。
    import uuid
    print(uuid.uuid4()) # 4b994059-b244-44c8-ba7a-4282bb504f78
    print(type(uuid.uuid4())) # <class 'uuid.UUID'>
    

flask路由自動重定向(瞭解即可,手動設置路由重定向纔是重點)

flask的哲學:/index/和/index是兩個不同的URLpath,不能搞混了。

代碼舉例說明/index/和/index是兩個不同的URLpath

#!/usr/bin/python3
# @FileName    :flask_redirect.py
# @Time        :2020/6/1 下午11:47
# @Author      :ABC
# @Description :
from flask import Flask

app = Flask(__name__)


@app.route("/index")
def index():
    return "這是`/index`頁面!"


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

此時訪問http://127.0.0.1:5000/index , 前端頁面會展示這是index頁面!

然後在訪問http://127.0.0.1:5000/index/ ,前端頁面會展示Not Found。The requested URL was not found on the server. If you entered the URL manually please check your spelling and try again.

翻譯過來說的就是:找不到。在服務器上找不到請求的URL。如果您手動輸入網址,請檢查拼寫,然後重試。

這就說明了/index/和/index是兩個不同的URLpath,體現了flask的嚴謹哲學(手動狗頭~)

flask自動重定向示例

再看下邊的代碼

#!/usr/bin/python3
# @FileName    :flask_redirect.py
# @Time        :2020/6/1 下午11:47
# @Author      :ABC
# @Description :
from flask import Flask

app = Flask(__name__)


@app.route("/index/")
def index():
    return "這是index頁面!"


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

相比之前的代碼,現在的index()視圖函數綁定的路由的URLpath/index/比之前的index()視圖函數綁定的路由的URLpath/index多了一個/斜槓。

此時我們再次訪問http://127.0.0.1:5000/index ,發現前端依然展示這是index頁面!,說明響應成功了。

然後我們使用F12打開瀏覽器抓個包看一下。
瀏覽器抓到兩個index相關的請求包
我們可以看到一共抓到了兩個index相關的請求包。

先看一下第一個/index的請求包的響應狀態碼(Status Code)響應頭(Response Headers)信息
在這裏插入圖片描述
可以看到接口響應狀態碼爲308,也就是永久重定向(PERMANENT REDIRECT)

然後接着看/index的響應體數據,發現沒有任何數據。
index的響應體數據

然後再接着看/index/響應狀態碼(Status Code)200
在這裏插入圖片描述

/index/的響應體數據纔是返回了我們定義的路由函數的返回值這是index頁面!
index斜槓的響應數據

總結一下,當我們訪問http://127.0.0.1:5000/index 時,而我們實際的視圖函數index()中路由綁定的URLpath是/index/,但是flask程序最後依然通過308永久重定向將請求由/index重定向到/index/了,這就體現了flask的靈活且對用戶友好的特點

最後再來看一下flask自動重定向請求的整個過程。

flask訪問URLpath不帶斜槓後永久重定向流程

路由註冊機制

那麼在flask中如何手動設置重定向呢,首先我們先來搞懂flask中的路由註冊機制,順便總結一下在flask中註冊路由的相關知識。

flask中註冊路由一共有2種方法

  1. 裝飾器註冊,也就是在視圖函數上使用裝飾器[@app.route("/index/")]來綁定路由,如:
    @app.route("/index/")
    def index():
        return "這是index頁面!"
    
  2. 集中註冊路由,通過app.add_url_rule()來集中註冊路由,如:
    #!/usr/bin/python3
    # @FileName    :flask_redirect.py
    # @Time        :2020/6/1 下午11:47
    # @Author      :ABC
    # @Description :
    from flask import Flask
    
    app = Flask(__name__)
    
    
    # @app.route("/index")
    # def index1():
    #     return "這是index頁面!"
    
    # @app.route("/index/")
    # def index():
    #     return "這是index頁面!"
    
    
    def hello():
        return "hello"
    
    
    def say_name():
        return "我叫小花花!"
    
    
    app.add_url_rule('/hello', hello)
    # endpoint設置爲`註冊路由的地址`,也就是`URLpath`;view_func設置爲視圖函數名稱,注意視圖函數名稱不能加`()`,只要函數名
    app.add_url_rule(endpoint='/name', view_func=say_name)
    
    if __name__ == '__main__':
        app.run(debug=True)
    

總結一下,使用裝飾器註冊路由主要適用於flask小型項目,使用app.add_url_rule(endpoint=XXX, view_func=XXX)集中註冊路由主要適用於flask大型項目。

flask手動設置路由重定向

  1. 在裝飾器中使用redirect_to=XXX如:@app.route(redirect_to='/')

    #!/usr/bin/python3
    # @FileName    :flask_manual_redirect.py
    # @Time        :2020/6/3 上午12:24
    # @Author      :ABC
    # @Description :
    from flask import Flask
    
    app = Flask(__name__)
    
    
    @app.route("/")
    def home():
        return "這是home首頁!"
    
    
    print(app.url_map)
    
    
    @app.route("/login", methods=['GET'], endpoint='user_login', redirect_to='/')  # 在裝飾器中設置重定向,程序運行時不會執行當前視圖函數login() 
    def login():
        print('執行了login函數!')
        return "登錄成功!"
    
    
    if __name__ == '__main__':
        app.run(debug=True)
    

    啓動flask服務,前端訪問http://127.0.0.1:5000/login ,瀏覽器抓到的包如下

    抓到的第1個請求

    在這裏插入圖片描述

    抓到的第2個請求

    重定向2

    可以看到請求已經從/login被重定向到/了。同時控制檯也沒有打印login()視圖函數中的print('執行了login函數!')語句的內容說明了在裝飾器中設置重定向,程序運行時不會執行當前視圖函數login()

    在這裏插入圖片描述

  2. 通過在視圖函數的return語句調用flask包中redirect()方法來設置路由重定向

    #!/usr/bin/python3
    # @FileName    :flask_manual_redirect.py
    # @Time        :2020/6/3 上午12:24
    # @Author      :ABC
    # @Description :
    from flask import Flask, redirect
    
    app = Flask(__name__)
    
    
    @app.route("/")
    def home():
        return "這是home首頁!"
    
    
    print(app.url_map)
    
    
    # @app.route("/login", methods=['GET'], endpoint='user_login', redirect_to='/')  # 在裝飾器中設置重定向,程序運行時不會執行當前視圖函數login()
    # def login():
    #     print('執行了login函數!')
    #     return "登錄成功!"
    
    @app.route("/login", methods=['GET'], endpoint='user_login')
    def login():
        print('執行了login函數!')
        return redirect('/')  # 需要從flask包中導入`redirect`方法
    
    
    print(app.url_map)
    
    if __name__ == '__main__':
        app.run(debug=True)
    

    啓動flask服務,前端訪問http://127.0.0.1:5000/login ,瀏覽器抓到的包如下

    抓到的第1個請求

    在這裏插入圖片描述

    抓到的第2個請求

    在這裏插入圖片描述

    可以看到請求已經從/login被重定向到/了。同時控制檯也打印了login()視圖函數中的print('執行了login函數!')語句的內容說明了在視圖函數的return語句調用flask包中redirect()方法來設置路由重定向,依然會執行當前視圖函數login()的內容

    在這裏插入圖片描述

好了,今天的內容就到這裏了。好累啊-.-

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章