python

我愛Flask之URL和Flask檢視介紹

黃色標註部分重點注意

1. URL與函式的對映

       •一個URL要與執行函式進行對映,使用的是@.route裝飾器。
       •@app.route裝飾器中,可以指定URL的規則來進行更加詳細的對映,如果現在要對映一個文章篇數的URL,文章篇數的URL是/article/number/,number有可能為1、2、3…,那麼可以透過以下方式來對映:

@app.route('/article/<number>')
def article(number):
    return '這是我的第{}篇文章'.format(number)

       •上述其中,尖括號是固定語法不可改變,表示路由地址中傳入的引數,預設的資料型別是字串。如果需要限制引數型別,則要寫成限制類型:變數名,限制類型包括以下幾種:

string 預設的資料型別,接受任何沒有斜槓 / 的字串。
int 整型
float 浮點型
path 和string作用類似,但是可以傳遞斜槓 /
uuid uuid型別的字串
any 可以指定多條路路徑
路由對映測試:
from flask import Flask

app = Flask(__name__)

# 裝飾器,將當前路由對映到指定函式
@app.route('/ycx')
def first_flask():
    return '但行好事,莫問前程'


if __name__ == '__main__':
    app.run(debug=True)
網頁顯示:

       •我們在瀏覽器中輸入http://127.0.0.1:5000/ycx即可訪問到以下頁面:

在這裡插入圖片描述
       •同時我們還可以動態傳入引數,並指定引數型別

from flask import Flask

app = Flask(__name__)


# 裝飾器,將當前路由對映到指定函式
@app.route('/ycx')
def first_flask():
    return '但行好事,莫問前程'


@app.route('/article/<int:number>') #規定資料型別為int
def article(number):
    return '這是我的第{}篇文章'.format(number)


if __name__ == '__main__':
    app.run(debug=True)
網頁顯示:

在這裡插入圖片描述

顯然,此時引數只能是整型數字了不能是其它資料型別

       •一般情況下引數中不能包含 /, 如果要包含 /,必須將資料型別限制為path型別,除此區別之外,path型別與string型別使用基本一樣

如下測試:
from flask import Flask

app = Flask(__name__)


# 裝飾器,將當前路由對映到指定函式
@app.route('/ycx')
def first_flask():
    return '但行好事,莫問前程'


@app.route('/article/<int:number>')
def article(number):
    return '這是我的第{}篇文章'.format(number)


@app.route('/comment/<path:aid>') #path型別可用string 和 /
def comment_list(aid):
    return '這是我的第{}個評論'.format(aid)


if __name__ == '__main__':
    app.run(debug=True)
網頁顯示:

在這裡插入圖片描述

如果為字串型別或者引數中含有 / 時,則匹配comment_list(aid)函式

       •兩個路由訪問同一個函式可以用any型別來限制

如下測試:
from flask import Flask

app = Flask(__name__)


# 裝飾器,將當前路由對映到指定函式
@app.route('/ycx')
def first_flask():
    return '但行好事,莫問前程'


@app.route('/article/<int:number>')
def article(number):
    return '這是我的第{}篇文章'.format(number)


@app.route('/comment/<path:aid>')
def comment_list(aid):
    return '這是我的第{}個評論'.format(aid)


@app.route('/<any(list,dict):url_path>/')
def message(url_path):
    if url_path == 'list':
        return '當前路由是list'
    else:
        return '當前路由是dict'


if __name__ == '__main__':
    app.run(debug=True)
網頁顯示:

在這裡插入圖片描述

此時訪問路由時需要在路徑最後新增 / 才能正常訪問,如/<any(list,dict):url_path>/

       •如果不想透過指定子路徑來傳遞引數,也可以透過 ?=的形式來傳遞引數,例如:/article?id=xxx這種情況下,可以透過request.args.get(‘id’)來獲取id的值
       •如果是post方法,則需要透過request.form.get(‘id’)來進行獲取id的值。
       •如果需要在flask中使用上述方法,需先匯入request庫 from flask import request

如下測試:
from flask import Flask, request

app = Flask(__name__)


# 裝飾器,將當前路由對映到指定函式
@app.route('/ycx')
def first_flask():
    return '但行好事,莫問前程'


@app.route('/article/<int:number>')
def article(number):
    return '這是我的第{}篇文章'.format(number)


@app.route('/comment/<path:aid>')
def comment_list(aid):
    return '這是我的第{}個評論'.format(aid)


@app.route('/<any(list,dict):url_path>/')
def message(url_path):
    if url_path == 'list':
        return '當前路由是list'
    else:
        return '當前路由是dict'


@app.route('/cx')
def search():
    return request.args.get('name')


if __name__ == '__main__':
    app.run(debug=True)
網頁顯示:

在這裡插入圖片描述

request.args.get()中傳入的引數未在URL中傳入,會出現報錯,因為URL未傳入name引數,所以request.args.get()方法的值為空,即檢視函式search()返回的值為空,不能渲染,所以會出現報錯
網頁顯示:

在這裡插入圖片描述

有問題可以在評論指正,歡迎討論,謝謝大家!!

本文章已修改原文用詞符合繁體字使用者習慣使其容易閱讀

版權宣告:此處為CSDN博主「晨曦y」的原創文章,依據CC 4.0 BY-SA版權協議,轉載請附上原文出處連結及本宣告。

原文連結:https://blog.csdn.net/qq_45261963/article/details/109105352